<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>The blog of Robert Herbig</title>
 <link href="http://www.rpherbig.com/atom.xml" rel="self"/>
 <link href="http://www.rpherbig.com"/>
 <updated>2026-02-20T02:11:30+00:00</updated>
 <id>http://www.rpherbig.com</id>
 <author>
   <name>Robert Herbig</name>
   <email>robert@rpherbig.com</email>
 </author>

 
 <entry>
   <title>Speaking: When is a Regular Expression Better Than Artificial Intelligence?</title>
   <link href="http://www.rpherbig.com/2025/08/06/When-is-a-Regular-Expression-Better-Than-Artificial-Intelligence.html"/>
   <updated>2025-08-06T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/08/06/When-is-a-Regular-Expression-Better-Than-Artificial-Intelligence</id>
   <content type="html">&lt;h2 id=&quot;given-at&quot;&gt;Given at&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.devupconf.org/&quot;&gt;dev up Conference&lt;/a&gt; 2025: &lt;a href=&quot;https://www.dropbox.com/scl/fi/kt6pe4fa3dv4dw9drweew/When-is-a-Regular-Expression-Better-Than-Artificial-Intelligence_-Dev-Up-2025.pdf?rlkey=m8svv5kgcs6273a1f8ynuok56&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.kcdc.info/&quot;&gt;KCDC&lt;/a&gt; 2024: &lt;a href=&quot;https://www.dropbox.com/scl/fi/jurrdwhz4owhqmidok807/When-is-a-Regular-Expression-Better-Than-Artificial-Intelligence_-KCDC-2024.pdf?rlkey=t278mw9znl1g4xjnt4ugploy9&amp;amp;st=wfbra18c&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://codemash.org/&quot;&gt;CodeMash&lt;/a&gt; 2023&lt;/li&gt;
  &lt;li&gt;Indy.Code() 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Natural language processing is a technique for taking human understandable text and wresting machinable information from it through a variety of techniques.  When we think about NLP, we typically think about tasks like assessing the tone of a passage of text, answering questions stated in natural language, or summarizing a large amount of text.  We recently helped a client build a system for scoring pre-interview screening assessments using AI &amp;amp; ML.&lt;/p&gt;

&lt;p&gt;Typically, we spend a great deal of effort trying to convince our clients that there are AI techniques relevant to their problems, and that those approaches are mature enough for prime-time use.  Here, I had the opposite problem: the client knew AI was appropriate for their problems, and they were absolutely convinced it was ready for deployment.  However, they wanted to use AI to solve all of their automated scoring problems.  Over the course of building the system, I found several situations where simpler non-AI techniques could provide comparable or better performance than state of the art AI.&lt;/p&gt;

&lt;p&gt;In this talk, we’ll discuss:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Why automating scoring was a fundamental business need for our client&lt;/li&gt;
  &lt;li&gt;What their technical approach to automated scoring was&lt;/li&gt;
  &lt;li&gt;How we improved their existing AI models&lt;/li&gt;
  &lt;li&gt;How we identified situations where AI wasn’t the best approach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of the talk, the audience will:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Have been introduced to several models for AI-based natural language and code understanding&lt;/li&gt;
  &lt;li&gt;See a 10,000 foot view of how to automate scoring rubrics for assignments that include both programming and human communication&lt;/li&gt;
  &lt;li&gt;Have some rules of thumb for deciding when AI is necessary or when a simpler technique is likely to exist or be more desirable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;

&lt;p&gt;The target audience are people in positions of technical leadership on a project.  Specifically, both those that are trying to sell the adoption of newer technologies within an organization, and those that are trying to push back on the over-adoption of a new technology.&lt;/p&gt;

&lt;p&gt;Our talk will also go (briefly) into the gory details of a system that uses AI as part of its process.  This will likely interest developers that are interested in AI for its own sake as well as product owners looking to see what they can expect when incorporating AI into their products.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: What Are AI Agents, Anyway?</title>
   <link href="http://www.rpherbig.com/2025/08/06/What-Are-AI-Agents-Anyway.html"/>
   <updated>2025-08-06T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/08/06/What-Are-AI-Agents-Anyway</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.devupconf.org/&quot;&gt;dev up Conference&lt;/a&gt; 2025: &lt;a href=&quot;https://www.dropbox.com/scl/fi/jkdzxbpub2191xm01q1rc/What-Are-AI-Agents-Anyway_-Dev-Up-2025.pdf?rlkey=i94in9cvbcohg9imdrtk17gzt&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Terms like ‘AI agent’, ‘agent-based systems,’ and ‘agentic AI’ are trending, building on the momentum of Generative AI. This approach promises systems capable of autonomously executing complex tasks while adapting to changes with minimal human intervention.&lt;/p&gt;

&lt;p&gt;It’s one thing to promise, and another entirely to deliver. As the hype around “AI agents” grows, so does the confusion: What exactly are they? How do they differ from traditional AI models? Why do so many implementations fall short of their promises?&lt;/p&gt;

&lt;p&gt;In this talk, we’ll go over what AI agents really are: how they work, where they succeed, and where they fail. We’ll look at some agentic AI design patterns and how they are analogous to traditional software tools, databases, networks, and peer-to-peer systems.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Course: Building‍ Security into AI</title>
   <link href="http://www.rpherbig.com/2025/06/02/building-security-into-ai.html"/>
   <updated>2025-06-02T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/06/02/building-security-into-ai</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;APISEC CON 2025 course introduction: &lt;a href=&quot;https://www.youtube.com/watch?v=1wZIy2gdwKQ&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.apisecuniversity.com/courses/building-security-into-ai&quot;&gt;Course registration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;freeCodeCamp: &lt;a href=&quot;https://www.youtube.com/watch?v=0xah5jMflcI&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Livestream: &lt;a href=&quot;https://www.youtube.com/watch?v=6Gbx6qQv6XU&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;The API Hour podcast: &lt;a href=&quot;https://open.spotify.com/episode/6c8JzTv8OrZZc3Bwy8nBcH&quot;&gt;Hacking AI and Retraining LLMs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;This course demystifies AI development and shows you how to build security in from the start. Learn how AI differs from traditional apps, create a threat model, and analyze real-world breaches. Perfect for security pros ready to tackle the risks of AI-powered systems - before attackers do.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Can We Learn to Manage Uncertainty? Probably!</title>
   <link href="http://www.rpherbig.com/2025/05/02/Can-We-Learn-to-Manage-Uncertainty-Probably.html"/>
   <updated>2025-05-02T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/05/02/Can-We-Learn-to-Manage-Uncertainty-Probably</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://stirtrek.com/&quot;&gt;StirTrek&lt;/a&gt; 2025: &lt;a href=&quot;https://www.youtube.com/watch?v=8IMVuy85ebc&quot;&gt;Recording&lt;/a&gt;, &lt;a href=&quot;https://www.dropbox.com/scl/fi/90vfx6cu5sdy4r91t1mr6/Can-We-Learn-to-Manage-Uncertainty_-Probably-StirTrek-2025.pdf?rlkey=v35p9ycttl1ep1c53pw52qe8w&amp;amp;st=51h1e2ec&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;AgileLnL 2024: &lt;a href=&quot;https://www.youtube.com/watch?v=APUJNQYAz54&quot;&gt;Recording&lt;/a&gt;, &lt;a href=&quot;https://www.dropbox.com/scl/fi/ghl4q2i7nwc9ggchnk7e8/Can-We-Learn-to-Manage-Uncertainty_-Probably-Agile-LnL-2024.pdf?rlkey=q0560iw3jsg52bniwa3zlrcm4&amp;amp;st=w493w2dz&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.kcdc.info/&quot;&gt;KCDC&lt;/a&gt; 2024: &lt;a href=&quot;https://www.dropbox.com/scl/fi/157vvcw9pt2eaqp9mav2d/Can-We-Learn-to-Manage-Uncertainty_-Probably-KCDC-2024.pdf?rlkey=yslitfr392posdepi35o01ubs&amp;amp;st=8yq75kdg&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://codemash.org/&quot;&gt;CodeMash&lt;/a&gt; 2024: &lt;a href=&quot;https://www.dropbox.com/scl/fi/iyjtrhsgbsrpmp73nlyzo/Can-We-Learn-to-Manage-Uncertainty_-Probably-CodeMash-2024.pdf?rlkey=t5fiqrm3bgghon9wzoqnfpfz0&amp;amp;st=o8w3nqdp&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://momentumdevcon.com/&quot;&gt;Momentum Developer Conference&lt;/a&gt; 2023&lt;/li&gt;
  &lt;li&gt;Indy.Code() 2023: &lt;a href=&quot;https://vimeo.com/855521262&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;When we’re asked when something will be done, it’s tempting to answer the question. “It’ll be done on March 32nd,” “It’ll take 182.5 days,” or “We need 15 sprints”. Whether that answer is the best-case, average, or worst-case scenario doesn’t matter.&lt;/p&gt;

&lt;p&gt;The answer is fundamentally wrong because using a single value hides the fact that we really meant a distribution of possible dates, durations, or outcomes. The exact value is uncertain. Development may be faster or slower than we thought. What if the tech lead wins the lottery and retires? What if a global pandemic forces us to change the way we work?&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Vibe Coding Is the Purest Form of Agile (And That's the Problem)</title>
   <link href="http://www.rpherbig.com/2025/04/23/vibe-coding-is-the-purest-form-of-agile.html"/>
   <updated>2025-04-23T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/04/23/vibe-coding-is-the-purest-form-of-agile</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://sep.com/blog/vibe-coding-is-the-purest-form-of-agile/&quot; /&gt;

&lt;blockquote&gt;
  &lt;p&gt;Vibe coding absolutely nails the values of Agile, and quietly violates the mechanisms that make Agile work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vibe coding might be the purest form of Agile we’ve ever seen. No standups, no tickets, no backlog grooming, just chaos and bliss. It nails the Agile values: working software, responding to change, and individuals over process. The loop is immediate. The feedback is constant. The friction is near zero. It feels like Agile distilled: velocity, autonomy, and iteration, without the weight of process.&lt;/p&gt;

&lt;p&gt;Admittedly, vibe coding is an informal, emergent practice, not a process like Agile. But by turning certain Agile values up to maximum and stripping away everything else, vibe coding stress-tests which parts of Agile actually matter.&lt;/p&gt;

&lt;p&gt;And that’s where things get interesting. Because while vibe coding looks like Agile - maybe even more Agile than Agile has ever dared to be - it quietly violates the deeper structures that make Agile work over time. Shared understanding fades. Feedback loops turn inward. Coherence breaks down. It’s not just fast, it’s fragile.&lt;/p&gt;

&lt;p&gt;If you think vibe coding is the future, ask how many of your experiments survived a second week. If you think Agile already solved all this, ask why vibe coding feels so much faster. Neither view is wrong, they’re both incomplete.&lt;/p&gt;

&lt;h1 id=&quot;vibe-coding-appears-deeply-aligned-with-agile&quot;&gt;Vibe Coding Appears Deeply Aligned with Agile&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Working software over comprehensive documentation.&lt;/strong&gt; Vibe coding delivers code that runs, immediately. There’s no spec to write, no ticket to close - just a tight loop of writing, testing, and refining. You see the result as you build. It’s software first, everything else second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Responding to change over following a plan.&lt;/strong&gt; Plans barely exist in vibe coding. Every output is provisional. You revise prompts, rework logic, pivot direction on the fly. Change isn’t a reaction - it’s the baseline. Nothing gets locked in, and that’s the point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Individuals and interactions over processes and tools.&lt;/strong&gt; Vibe coding is centered on the developer’s direct engagement with the AI model. There’s no ceremony, no defined roles. The interaction is immediate, continuous, and entirely individual-driven.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer collaboration over contract negotiation.&lt;/strong&gt; There’s always some input guiding the work: a user’s need, a stakeholder’s goal, or the developer’s evolving sense of what’s useful. The collaboration isn’t formalized, but it’s embedded in the loop. Build, observe, adjust: it happens in real time.&lt;/p&gt;

&lt;p&gt;Bonus content (because changing the pattern mid-stream feels on-brand): &lt;strong&gt;simplicity is the art of maximizing the amount of work not done&lt;/strong&gt;. Okay, this one’s from the Agile principles, not the Manifesto itself - but vibe coding nails it anyway. There’s no overhead, no filler, no wasted motion. It’s just raw intent turned into running code, as directly as possible.&lt;/p&gt;

&lt;h1 id=&quot;but-vibe-coding-quietly-violates-agiles-deeper-principles&quot;&gt;But Vibe Coding Quietly Violates Agile’s Deeper Principles&lt;/h1&gt;

&lt;p&gt;The most efficient and effective method of conveying information is &lt;strong&gt;face-to-face conversation&lt;/strong&gt;. Vibe coding narrows the loop to a single person and their machine. Context lives in prompts, short-term memory, and intuition, not shared conversation. There’s no mechanism for building a shared understanding across a team, because there’s no team in the loop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business people and developers must work together daily&lt;/strong&gt; throughout the project. Collaboration in vibe coding is optional at best. The loop loses the richness of diverse perspectives. Designers, testers, domain experts - they’re all out of the loop. Feedback tends to be internal, based on feel, not validation. The result isn’t just fragile software, it’s narrow software: software that reflects local judgments, not shared goals. Vibe coding works best when the person writing the prompts already knows where the bodies are buried. They understand the context, the constraints, and the trade-offs without needing to ask. But that kind of tacit knowledge doesn’t scale and it doesn’t transfer. The fewer people involved, the more brittle the outcome becomes.&lt;/p&gt;

&lt;p&gt;Agile processes promote &lt;strong&gt;sustainable development&lt;/strong&gt;. Vibe coding burns hot. Without intentional pacing, prioritization, or checkpoints, developers tend to sprint until the architecture collapses or they spot the next shiny thing. Refactoring is often reactive, if it happens at all. More often, entropy wins. It’s fast but not steady.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Continuous attention to technical excellence enhances agility.&lt;/strong&gt; That attention rarely happens in vibe coding. The focus is on “Does it work right now?” not “Will it still work next week?” Quality, consistency, and structure tend to degrade unless intentionally reintroduced, but by then entropy has already taken hold.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Working software is the primary measure of progress.&lt;/strong&gt; In vibe coding, “working” can mean “generates output” rather than “solves the right problem.” Without external validation or shared definitions of done, progress becomes subjective and fragile.&lt;/p&gt;

&lt;p&gt;And maybe the resemblance was never real to begin with. The Agile Manifesto doesn’t reject the values on the right, it just prioritizes the ones on the left. Vibe coding often ignores the right entirely. It doesn’t de-emphasize documentation, planning, validation, or collaboration - it ignores them. That’s not an extreme form of Agile. It’s something else pretending to be Agile because it happens to move fast.&lt;/p&gt;

&lt;h1 id=&quot;bridging-the-gap-between-vibe-and-viability&quot;&gt;Bridging the Gap Between Vibe and Viability&lt;/h1&gt;

&lt;p&gt;Vibe coding feels like the purest form of Agile, but that purity turns out to be brittle. It strips away ceremony, friction, and delay, delivering working software with minimal overhead. But in doing so, it also strips away the mechanisms that make software sustainable: shared understanding, external validation, and coherence over time. And when you look closely, it’s not just Agile pushed to its limits, it’s something else entirely. It mimics the values but discards the balance. What looks like Agility becomes erosion by another name: &lt;strong&gt;&lt;em&gt;frAgile&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The solution isn’t to abandon vibe coding or to force traditional process back onto it. It’s to recognize where it falters and build lightweight practices that provide missing structure without killing the flow. Practices that preserve context, capture intent, and invite meaningful feedback, without getting in the way.&lt;/p&gt;

&lt;p&gt;Vibe coding isn’t broken. It’s unfinished. It gives us speed, iteration, and flow, but not longevity, clarity, or shared direction. Vibe coding thrives in zero-overhead environments. But Agile assumes motivated individuals aren’t left alone - they’re supported, aligned, and operating in a shared context. Vibe coding removes the need for that support until it has to scale, share, or hand off. Then the missing scaffolding shows. What works beautifully in a solo loop collapses when we need to scale beyond more than one person - not because the tools are wrong, but because the patterns are missing. The challenge now is to shape practices that keep the momentum without sacrificing meaning. If vibe coding feels like the purest form of Agile, the next step is to ask: what does it take to make that purity scale?&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Why Vibe Coding Fails - and How Signal Coding Fixes It</title>
   <link href="http://www.rpherbig.com/2025/04/02/vibe-coding-evolved.html"/>
   <updated>2025-04-02T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/04/02/vibe-coding-evolved</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://sep.com/blog/vibe-coding-evolved/&quot; /&gt;

&lt;blockquote&gt;
  &lt;p&gt;AI is an &lt;strong&gt;amplifier&lt;/strong&gt; for whatever &lt;strong&gt;signal&lt;/strong&gt; we humans provide. Garbage in, garbage out. Signal in, software out.&lt;/p&gt;

  &lt;p&gt;– Robert Herbig, in the thing you’re currently reading&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you haven’t heard of &lt;strong&gt;vibe coding&lt;/strong&gt;, it’s an interesting concept: you prompt an AI agent to do all the coding and focus on fast iterations. Minimize time from thought to working application. Don’t worry about the code itself, only the application produced. I had to try it, just to see what the fuss was about. At first, it was incredible: the AI gave me working UIs, full features, even decent front-end styling. No scaffolding, no boilerplate, just results. An application that matched my vision with minimal effort.&lt;/p&gt;

&lt;p&gt;The code was a mess: no structure, no reuse, no best practices. But who cares? The app worked.&lt;/p&gt;

&lt;p&gt;Then I tried to change something and everything fell apart. The AI got stuck in what I call an &lt;strong&gt;entropy loop&lt;/strong&gt;. Vibe coding stopped producing results and making progress. Each fix introduced new bugs or broke something else. I was knee-deep in brittle, incoherent code I didn’t write and didn’t want to debug.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/vibe_coding_entropy_loop.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Vibe coding got me velocity, but not stability or sustainability.&lt;/p&gt;

&lt;p&gt;Once I cleaned up the code (introduced structure, patterns, tests), the AI agent came alive again. Suddenly it could extend features, fix bugs, even refactor, all with minimal direction. That’s when it clicked: these agents thrive on clean code, just like human developers.&lt;/p&gt;

&lt;p&gt;If I could keep the speed and inject intent, architecture, and quality, I could get the best of both worlds. That’s &lt;strong&gt;&lt;em&gt;Signal Coding&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h1 id=&quot;vibe-coding-and-the-drift-into-entropy-loops&quot;&gt;Vibe Coding and the Drift Into Entropy Loops&lt;/h1&gt;

&lt;p&gt;Vibe coding is optimized for speed. We describe what we want, and the AI builds it. Minimal time spent on setup or planning, the AI will figure it out. It’s pure iteration - we keep prompting until we get what we’re after.&lt;/p&gt;

&lt;p&gt;This works well for early exploration: discovery, prototyping, validating an idea, generating UI scaffolds, or creating quick backends. We’re not worried about code quality or structure and are entirely focused on visible results. And for short bursts, that tradeoff makes sense.&lt;/p&gt;

&lt;h2 id=&quot;self-reinforcing-entropy-loops&quot;&gt;Self-reinforcing Entropy Loops&lt;/h2&gt;

&lt;p&gt;In practice, this approach doesn’t scale. What makes vibe coding powerful in the first few prompts is exactly what makes it fragile over time. The more we build this way, the faster the system drifts into &lt;strong&gt;self-reinforcing entropy loops&lt;/strong&gt;. These AI systems fundamentally rely on clarity and structure to function effectively, yet the code produced through vibe coding inherently lacks both. Each round of changes increases the confusion, making it progressively harder for the AI to navigate its own creation.&lt;/p&gt;

&lt;p&gt;There are two broad reasons vibe coding breaks down:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;The AI can’t see enough of the system. Its context is narrow and stateless.&lt;/strong&gt; It works locally, not holistically. This causes breakdowns that may improve with longer context windows, better memory, or improved agent-based tools.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;The AI isn’t capable of creating code it can reason about over the long-term.&lt;/strong&gt; Even if it writes working code, it doesn’t lay foundations it can build on. There’s no continuity, no internal consistency, no long-term structure. The result is a codebase that slowly becomes unworkable, even to the agent that created it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ll explain these in more detail later.&lt;/p&gt;

&lt;h1 id=&quot;what-is-signal-coding-really&quot;&gt;What Is Signal Coding (Really)?&lt;/h1&gt;

&lt;p&gt;Signal Coding is how we make vibe coding work past the first few prompts. Where vibe coding prioritizes output, Signal Coding prioritizes continuity. It’s a collection of practices that help the AI produce systems it can still reason about later. We’re not asking the AI to write perfect code, we’re just giving it the conditions it needs to succeed over time.&lt;/p&gt;

&lt;p&gt;That means helping the AI build within a structure, keeping naming and abstractions consistent, prompting in smaller units, and resetting context between tasks. These aren’t heavyweight processes. They’re ways of injecting just enough signal to prevent drift. If vibe coding is about speed, Signal Coding is how we keep that speed from turning into churn.&lt;/p&gt;

&lt;h1 id=&quot;core-practices-of-signal-coding&quot;&gt;Core Practices of Signal Coding&lt;/h1&gt;

&lt;p&gt;Signal Coding isn’t about slowing down or reintroducing heavyweight processes. It’s about adding just enough structure to keep the AI grounded. These practices aren’t theoretical, they’re practical ways to make sure the code we generate remains usable, extendable, and comprehensible, even as we move fast.&lt;/p&gt;

&lt;h2 id=&quot;plan-and-structure-first&quot;&gt;Plan and Structure First&lt;/h2&gt;

&lt;p&gt;We don’t start with code. &lt;strong&gt;We start with a plan.&lt;/strong&gt; Before we prompt, we discuss options with the AI, decide on an approach, and document those decisions. A simple PLAN.md file becomes the anchor for our design choices: naming, responsibilities, system boundaries, feature order, notes, etc. These plans don’t have to be just text. Visuals, especially &lt;a href=&quot;https://mermaid.js.org/&quot;&gt;Mermaid diagrams&lt;/a&gt;, can be a powerful addition. Humans benefit from seeing structure laid out visually, and AIs understand that format unusually well. It’s one of the rare cases where the same artifact works equally well for both.&lt;/p&gt;

&lt;p&gt;Most crucially, &lt;strong&gt;we must keep it up to date as we go&lt;/strong&gt;, which is easily done by telling the AI to update it after each change or commit. This file also serves as an efficient way for the AI to restore its context and “remind itself” where we left off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This planning can be fractal&lt;/strong&gt;. We do it at the feature level, but also within smaller scopes such as new components, tricky functions, or design pivots. At each level, a bit of structure makes the next step easier to express, for both us and the AI. The AI will easily understand nested PLAN.md files.&lt;/p&gt;

&lt;h2 id=&quot;prompt-intentionally&quot;&gt;Prompt Intentionally&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;We prompt for small, focused changes&lt;/strong&gt; - roughly the size of a clean commit. Each step should be easy to understand, easy to review, and easy to course-correct. This incremental flow helps us shape the system without stepping out of our architectural mindset. We stay high enough to guide design and behavior, but close enough to see what’s actually changing.&lt;/p&gt;

&lt;p&gt;When we describe a change, we don’t just say what we want, we also say &lt;strong&gt;how we want it structured&lt;/strong&gt;. We describe boundaries, layers, and intent. The AI will still generate the code, but it’s doing so inside a frame we’ve chosen. This can often be simplified or omitted if we’ve discussed the plan and design ahead of time with the AI (such as the aforementioned PLAN.md file).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat each new feature or task as a fresh context.&lt;/strong&gt; Just like we mentally reset when we move on to a new task, we need to reset the AI’s context. A new session helps avoid context drift and prevents unrelated decisions or code from earlier prompts from interfering with the current task.&lt;/p&gt;

&lt;h2 id=&quot;inject-durable-signal&quot;&gt;Inject Durable Signal&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Define names with intent.&lt;/strong&gt; That doesn’t mean naming every variable ourselves - it means introducing meaningful project-specific concepts and domain-specific terms to the AI early in the process, so it has clear anchors to build on. When the model sees those concepts used with clarity and consistency, it’s more likely to reuse them correctly across files and features. This reinforces structure without requiring us to manage every detail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encourage the AI to use abstraction early.&lt;/strong&gt; If we see the AI repeating logic, we must nudge it to extract helpers or reusable components. Even light scaffolding helps prevent drift later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use types and tests as constraints.&lt;/strong&gt; These don’t just validate behavior - they reinforce expectations. They’re part of the prompt history, and they shape how the AI reasons about the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comments and documentation matter, too.&lt;/strong&gt; We must not overdo them, but include enough to explain why things exist and how they’re meant to be used. Inline docstrings, file headers, and light &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; notes all help stabilize the AI’s understanding of the system.&lt;/p&gt;

&lt;h2 id=&quot;stabilize-and-refactor&quot;&gt;Stabilize and Refactor&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;We don’t wait for the code to break before cleaning it up.&lt;/strong&gt; Refactoring is how we reinforce the patterns we want the AI to follow. If a function name is ambiguous or overloaded, tell the AI to clarify it. If logic is scattered or duplicated, tell the AI to consolidate it. These aren’t just maintenance tasks, they’re opportunities to clarify our signal. We can even discuss refactoring options with the AI, exploring tradeoffs before committing to a change. That dialogue helps align the model with our intent and keeps us in control of the system’s shape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manage the code’s surface area.&lt;/strong&gt; We collapse one-off experiments once we’ve chosen a direction, clean up abandoned files, and remove unused code. The more we reduce noise, the more clearly the AI can hear our intent.&lt;/p&gt;

&lt;h1 id=&quot;why-vibe-coding-fails-over-time&quot;&gt;Why Vibe Coding Fails Over Time&lt;/h1&gt;

&lt;h2 id=&quot;failures-driven-by-limited-context&quot;&gt;Failures Driven by Limited Context&lt;/h2&gt;

&lt;p&gt;Some problems with vibe coding are caused by the AI’s limited context. These are failure modes we can expect to improve as models gain broader memory, better tool use, and long-term reasoning capabilities.&lt;/p&gt;

&lt;p&gt;The first is a bias toward &lt;strong&gt;fix-it-where-you-see-it&lt;/strong&gt;. The AI makes changes where the problem appears, not where it originates. It applies local fixes instead of systemic ones. It rarely steps back to consider architectural implications or broader effects. This is a direct result of narrow and mostly stateless context. Each prompt is a short-term reaction, not a holistic adjustment.&lt;/p&gt;

&lt;p&gt;The second is &lt;strong&gt;inconsistent use of abstractions and reuse&lt;/strong&gt;. Sometimes the AI writes good helpers or modular components. Other times it reimplements logic that already exists, slightly differently, in another file. Whether it reuses existing code often depends on whether that code is visible in the current context window. When it’s not, the AI reinvents: often inconsistently and failing to keep duplicated code in sync.&lt;/p&gt;

&lt;p&gt;These issues are real, but they’re not fundamental. With broader memory, better indexing tools, or agentic workflows, we can reasonably expect these limitations to diminish. But even if they’re solved, they won’t be enough on their own.&lt;/p&gt;

&lt;h2 id=&quot;failures-intrinsic-to-vibe-coding&quot;&gt;Failures Intrinsic to Vibe Coding&lt;/h2&gt;

&lt;p&gt;Other failures aren’t just about limited context, they’re simply baked into the approach. Vibe coding optimizes for fast, one-shot results. That mindset, by default, produces systems that break down under pressure.&lt;/p&gt;

&lt;p&gt;The biggest issue: &lt;strong&gt;the AI will make the code work - at any cost&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;patches over problems instead of solving them&lt;/li&gt;
  &lt;li&gt;hardcodes values to make tests pass&lt;/li&gt;
  &lt;li&gt;mocks things that shouldn’t be mocked&lt;/li&gt;
  &lt;li&gt;builds fragile layers of workaround logic, because that’s the fastest way to produce a passing output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These decisions aren’t bugs, rather they’re a side effect of asking the AI to prioritize results over reasoning or long-term stability.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;AI doesn’t know anything. It simulates understanding. What is actually wants is approval.&lt;/p&gt;

  &lt;p&gt;– Jesse James Garrett&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vibe coding also promotes a kind of &lt;strong&gt;structural drift&lt;/strong&gt;. It lacks the perspective of a software architect, and without a persistent design philosophy, there’s no plan, no intentional layering, no shared metaphors across modules. Even if the AI generated each part successfully, the system as a whole becomes harder to reason about. Every change increases the odds of breakage or contradiction.&lt;/p&gt;

&lt;p&gt;And crucially: &lt;strong&gt;these problems don’t go away with more context&lt;/strong&gt;. You can give a model the entire codebase and it will still optimize for the shortest path to a working result. That’s what we’re asking it to do. Without guardrails or architectural signal, it will solve local problems and accumulate global debt.&lt;/p&gt;

&lt;p&gt;This is why entropy loops form and why they’re inevitable without a change in our workflow.&lt;/p&gt;

&lt;h2 id=&quot;symptoms-of-the-entropy-loop&quot;&gt;Symptoms of the Entropy Loop&lt;/h2&gt;

&lt;p&gt;As we go deeper into a vibe-coded system, certain failure modes may start to appear. These are signs that the system is beginning to resist change—that the AI is struggling to navigate the very code it created:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;The AI starts to misunderstand its own output.&lt;/strong&gt; It misinterprets variable and function names, revisits or undoes changes it already made, and cycles through attempts that never quite resolve the issue. We see it get stuck, changing things just to change them, with no meaningful progress. This kind of churn burns dollars and time that could be better spent if we avoided this pitfall.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;It begins to duplicate logic instead of reusing it.&lt;/strong&gt; Even when equivalent code already exists, the AI reimplements it in slightly different ways. This usually happens when relevant logic is outside the current context, but even when it isn’t, the model can fail to use its own prior work. The result is subtle violations of DRY that fragment the codebase and make future changes harder to coordinate.&lt;/li&gt;
  &lt;li&gt;Even once we recognize that we’re in an entropy loop, &lt;strong&gt;it’s often easier to delete the code than to fix it&lt;/strong&gt;. The AI struggles to clean up its own mess. It can’t refactor the broken logic it produced earlier, because it no longer understands how the pieces fit together. We can prompt it to fix things, but the result is usually more churn. At that point, starting over is often the best path forward.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Prompting becomes an exercise in micromanagement.&lt;/strong&gt; We spend more time crafting fragile, overly specific prompts than building features. Instead of working with the AI, we’re fighting it - trying to nudge it toward something coherent without breaking everything else. This completely breaks the feedback loop that makes vibe coding powerful. Instead of staying focused on high-level strategy and iteration, we’re forced back into low-level debugging and reactive cleanup.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These symptoms don’t always arrive all at once, but when they start to cluster, we’re in an entropy loop. The code is no longer helping the AI think, it’s getting in the way.&lt;/p&gt;

&lt;h1 id=&quot;signal-coding-breaking-the-entropy-loop&quot;&gt;Signal Coding: Breaking the Entropy Loop&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding&lt;/strong&gt; unlocks speed, but without structure, that speed turns into churn. We start fast, but we stall. &lt;strong&gt;Signal Coding&lt;/strong&gt; is how we keep moving.&lt;/p&gt;

&lt;p&gt;This isn’t about slowing down. It’s about avoiding &lt;strong&gt;entropy loops&lt;/strong&gt;. Staying strategic. Staying architectural. With a few lightweight practices we give the AI what it needs to keep helping us. We keep our systems navigable, testable, and extendable, even as we move fast.&lt;/p&gt;

&lt;p&gt;You don’t need to adopt all of these practices at once. Start small: document your next feature in a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PLAN.md&lt;/code&gt;, prompt for a single focused change, code review the result, refactor, and reset the AI context when switching tasks. Even just these habits will make vibe coding far more stable, predictable, and scalable.&lt;/p&gt;

&lt;p&gt;Once you feel that loop open up again - fast, clear, focused - you’ll never want to go back.&lt;/p&gt;

&lt;p&gt;If you give it a try, I’d love to hear what works for you and what doesn’t!&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Escaping the Trap of Self-Sabotaging Meetings</title>
   <link href="http://www.rpherbig.com/2025/01/15/Escaping-the-Trap-of-Self-Sabotaging-Meetings.html"/>
   <updated>2025-01-15T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2025/01/15/Escaping-the-Trap-of-Self-Sabotaging-Meetings</id>
   <content type="html">&lt;h2 id=&quot;escaping-the-trap-of-self-sabotaging-meetings&quot;&gt;Escaping the Trap of Self-Sabotaging Meetings&lt;/h2&gt;

&lt;h3 id=&quot;given-at&quot;&gt;Given at&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://codemash.org/&quot;&gt;CodeMash&lt;/a&gt; 2026&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;abstract&quot;&gt;Abstract&lt;/h3&gt;

&lt;p&gt;Meetings are so notorious for draining productivity that historic sabotage manuals listed them as a tactic of choice. The trouble is, modern meetings often fall into the same traps by accident: too many people invited, vague agendas, and decisions that never stay decided. The result isn’t just a wasted hour, but a feedback loop: too many meetings leave no time to prepare, which makes meetings run longer, which forces multitasking, which makes them even less effective.&lt;/p&gt;

&lt;p&gt;In this talk, we show how to break those feedback loops before they start. Using lessons lifted from the old sabotage playbook, we’ll contrast common anti-patterns with practical counter-moves: picking the right type of meeting, deciding who actually needs to be there, shaping the environment and logistics, and closing with action and accountability. The aim is simple: meetings that respect time and deliver outcomes. Or, to misquote Arleen Lorrance, be the meeting you want to see happen.&lt;/p&gt;

&lt;p&gt;Learning outcomes&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Spot and break meeting feedback loops&lt;/li&gt;
  &lt;li&gt;Apply countermeasures to sabotage anti-patterns&lt;/li&gt;
  &lt;li&gt;Choose the right meeting type and environment&lt;/li&gt;
  &lt;li&gt;Use deliberate prep to respect time and attention&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;meeting-facilitation-dont-lose-before-you-start&quot;&gt;Meeting Facilitation Don’t Lose Before You Start&lt;/h2&gt;

&lt;h3 id=&quot;given-at-1&quot;&gt;Given at&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.kcdc.info/&quot;&gt;KCDC&lt;/a&gt; 2023&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;abstract-1&quot;&gt;Abstract&lt;/h3&gt;

&lt;p&gt;Meetings can be so hazardous to the productivity of an organization that the CIA’s precursor, the OSS, included them in their sabotage field manual. While we may not be called upon to thwart direct enemy action, as meeting facilitators we should run the kinds of meetings we would want to attend. There are many reasons meetings are ineffective, most of which can only be mitigated before the meeting happens. This talk will give you things to consider and do to prepare for a meeting.&lt;/p&gt;

&lt;p&gt;Attendees will leave with some techniques they can use today to make the most of their precious time. This is primarily aimed at anyone running a meeting. Facilitators, scrum masters, team leads, and managers most often do this, but anyone attending a meeting could benefit. To misquote Arleen Lorrance, “be the meeting you want to see happen.”&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Avoiding False Starts with Artificial Intelligence</title>
   <link href="http://www.rpherbig.com/2024/10/18/Avoiding-False-Starts-with-Artificial-Intelligence.html"/>
   <updated>2024-10-18T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2024/10/18/Avoiding-False-Starts-with-Artificial-Intelligence</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;AgileIndy 2024: &lt;a href=&quot;https://www.youtube.com/watch?v=GLifGhHBmig&quot;&gt;Recording&lt;/a&gt;, &lt;a href=&quot;https://www.dropbox.com/scl/fi/8g076mv00e5bw03bxs7rx/Avoiding-False-Starts-With-AI-AgileIndy-2024.pdf?rlkey=roatm4zeqqfqbs1nm7cioynnq&amp;amp;st=atbukv8p&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;AI Revolution: AI Conference 2023: &lt;a href=&quot;https://www.dropbox.com/scl/fi/m1tfsydhelp3j1bqlr034/Avoiding-False-Starts-AI-Revolution-2023.pdf?rlkey=gx4ri27ah5mgsfcf8a5tihwg4&amp;amp;st=xz7bems3&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.dropbox.com/scl/fi/u7plqwkg1owg03uelzs2i/Herbig-Thayer-Promo.mp4?rlkey=z3peb2q9t2xlhlgrrv1l7tzae&amp;amp;st=9nmulm4a&amp;amp;dl=0&quot;&gt;Promotional video&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stirtrek.com/&quot;&gt;StirTrek&lt;/a&gt; 2023: &lt;a href=&quot;https://www.youtube.com/watch?v=LAx5Rr8Hkss&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Indy.Code() 2022&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://nebraskacode.amegala.com&quot;&gt;Nebraska.Code()&lt;/a&gt; 2022&lt;/li&gt;
  &lt;li&gt;Indiana CIO Network - TechPoint 2020&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Artificial Intelligence (AI) is no longer science fiction; it’s here today, and it’s here to stay. It is in the products you use every day: home automation, digital assistants, or credit card fraud detection, just to name a few.&lt;/p&gt;

&lt;p&gt;All businesses will be affected by AI in the coming years, and the impact will be significant. The only remaining question is, how will you influence its effect on your company?&lt;/p&gt;

&lt;p&gt;Getting started with AI is a daunting task, but necessary for businesses who want to stay competitive. During this session, we’ll discuss:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How to determine if, where, and how to use AI effectively within your organization&lt;/li&gt;
  &lt;li&gt;When and how to build an AI team&lt;/li&gt;
  &lt;li&gt;Common early mistakes and pitfalls when getting started with AI&lt;/li&gt;
  &lt;li&gt;Typical misconceptions around AI and its application&lt;/li&gt;
  &lt;li&gt;What to look for in an AI partner or potential hire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning objectives&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;AI and humans have complementary capabilities&lt;/li&gt;
  &lt;li&gt;AI understands only what we tell it&lt;/li&gt;
  &lt;li&gt;Automation is better with a human-in-the-loop&lt;/li&gt;
  &lt;li&gt;Algorithms are as prejudiced as their data&lt;/li&gt;
  &lt;li&gt;AI means “thinking” differently&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Folks who provide technical leadership&lt;/li&gt;
  &lt;li&gt;Those who make technical steering decisions within a company&lt;/li&gt;
  &lt;li&gt;Developers interested in seeing how AI fails via malicious compliance&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: What Does Security Look Like When Building AI?</title>
   <link href="http://www.rpherbig.com/2024/10/16/What-Does-Security-Look-Like-When-Building-AI.html"/>
   <updated>2024-10-16T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2024/10/16/What-Does-Security-Look-Like-When-Building-AI</id>
   <content type="html">&lt;h2 id=&quot;given-at&quot;&gt;Given at&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://momentumdevcon.com/&quot;&gt;Momentum Developer Conference&lt;/a&gt; 2024: &lt;a href=&quot;https://www.dropbox.com/scl/fi/0iuerxwwwngagxuiz5iza/What-Does-Security-Look-Like-When-Building-AI-Momentum-2024.pdf?rlkey=8awl0xcionv4wnu65eb1efb5f&amp;amp;st=yhut4flz&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stirtrek.com/&quot;&gt;StirTrek&lt;/a&gt; 2024: &lt;a href=&quot;https://www.youtube.com/watch?v=eV0MGEE36-8&quot;&gt;Recording&lt;/a&gt;, &lt;a href=&quot;https://www.dropbox.com/scl/fi/p7j9v0cthyev38czzsywk/What-Does-Security-Look-Like-When-Building-AI-StirTrek-2024.pdf?rlkey=vyk6dfetqda30oypz7p1j85m9&amp;amp;st=gp4l2l8i&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://codemash.org/&quot;&gt;CodeMash&lt;/a&gt; 2024: &lt;a href=&quot;https://www.dropbox.com/scl/fi/tzi5l0qrjul5mrzrd5pf7/What-Does-Security-Look-Like-When-Building-AI_-CodeMash-2024.pdf?rlkey=acpcly7i4pbqcjszwqwq0gcho&amp;amp;st=9ustd8c7&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Anyone who is working with AI or considering doing so should care about security. When considering building an AI-powered system or product, the traditional attack surfaces and mitigations still apply. However, new attack surfaces can be present depending on the specific AI approaches used. In addition, due to the typically higher level of automation in AI systems, they can do more harm if they are compromised.&lt;/p&gt;

&lt;p&gt;In this talk, we’ll discuss how AI has the same attack vectors as traditional software, and what those attacks look like. We’ll also discuss new attacks that are specific to generative AI (e.g. LLMs like ChatGPT), machine learning &amp;amp; computer vision systems, and optimization techniques. For each type of attack, we’ll point out how they can be thwarted, or at least mitigated.&lt;/p&gt;

&lt;p&gt;Previous experience with AI and security are not required to benefit from the session. Attendees will see tools &amp;amp; techniques to help write more secure software, AI-enabled or not. They will walk away with a better understanding of AI-specific attack vectors and their mitigations. They will be equipped to find security education resources in the future.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: GenAI Adoption: Balancing Compliance, Innovation, and Action</title>
   <link href="http://www.rpherbig.com/2024/06/05/GenAI-Adoption-Balancing-Compliance-Innovation-and-Action.html"/>
   <updated>2024-06-05T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2024/06/05/GenAI-Adoption-Balancing-Compliance-Innovation-and-Action</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;SEPTalks 2024: &lt;a href=&quot;https://sep.com/event/septalks-event-genai-adoption/&quot;&gt;Landing Page&lt;/a&gt;, &lt;a href=&quot;https://vimeo.com/954499694&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Are tensions between your Legal, Compliance, and Engineering departments’ needs slowing down your adoption of Generative AI? You’re not alone.&lt;/p&gt;

&lt;p&gt;Leveraging generative-AI-based technologies is not just a concern for delivery teams; it can introduce new tensions between departments.&lt;/p&gt;

&lt;p&gt;The fundamental issue is that you want to take advantage of your data while keeping it secure. Thankfully there are effective ways to address this issue while respecting each department’s constraints, allowing your company to benefit from successful GenAI adoption.&lt;/p&gt;

&lt;p&gt;In this talk we will cover:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Responsible Implementation: methods for introducing GenAI within a company in a responsible manner that considers all stakeholders&lt;/li&gt;
  &lt;li&gt;Technology Management: strategies for maintaining control over data while still being proactive in leveraging GenAI for your business&lt;/li&gt;
  &lt;li&gt;Interdepartmental Coordination: ways to meet the diverse requirements of legal, regulatory, compliance, and engineering departments to ensure a unified approach to GenAI adoption&lt;/li&gt;
  &lt;li&gt;Case Study: SEP’s own experiences with adopting GenAI will be used as a practical example of responsibly navigating risks and opportunities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This event is ideal for those in leadership positions, from senior executives to engineers and product managers. Get valuable takeaways and strategies for managing GenAI.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: AI is More Than Just ChatGPT - How AI Can Help You Today</title>
   <link href="http://www.rpherbig.com/2023/12/13/AI-is-More-Than-Just-ChatGPT-How-AI-Can-Help-You-Today.html"/>
   <updated>2023-12-13T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2023/12/13/AI-is-More-Than-Just-ChatGPT-How-AI-Can-Help-You-Today</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;SEPTalks Webinar 2023: &lt;a href=&quot;https://sep.com/event/ai-webinar/&quot;&gt;Landing Page&lt;/a&gt;, &lt;a href=&quot;https://coda.io/d/AI-SEP_dEEHO0bSlx6/new-Conference-Talk-Tracking_sujbmE6o&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;AI has captured the attention of the world—for better or worse. Hype, noise, and fear are dominating the headlines, with a huge focus on ChatGPT and its competitors.&lt;/p&gt;

&lt;p&gt;Lost in the noise is the big picture: AI has been around for decades and already impacts our everyday lives.&lt;/p&gt;

&lt;p&gt;In this session, we’ll re-center the AI discussion for business:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;demystify ChatGPT functions and limitations, along with the rest of the AI landscape&lt;/li&gt;
  &lt;li&gt;outline business needs addressed by AI and provide real-life examples&lt;/li&gt;
  &lt;li&gt;discuss the current state of AI, what’s working well, and what to look out for&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Guest: AI and UX: Managing Expectations and Implications</title>
   <link href="http://www.rpherbig.com/2023/11/06/AI-and-UX-Managing-Expectations-and-Implications.html"/>
   <updated>2023-11-06T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2023/11/06/AI-and-UX-Managing-Expectations-and-Implications</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Delta CX Hive, episode 206: &lt;a href=&quot;https://www.youtube.com/watch?v=dcUJEXftu20&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;The recent advances in Generative AI (e.g. ChatGPT) have caused many people to ask how AI will impact their work. There will be changes to how we work, for better or worse. There is a lot of excitement around the “better” and a lot of fear around the “worse,” and often both are exaggerated.&lt;/p&gt;

&lt;p&gt;Jordan and Robert are two expert AI practitioners working at a software product design consultancy. Come join the conversation with them about what’s happening, what’s possible, what’s real, and what’s not… where UX and AI intersect.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Making Machine Learning More Effective By Applying Agile Practices via MLOps</title>
   <link href="http://www.rpherbig.com/2023/01/09/Making-Machine-Learning-More-Effective-By-Applying-Agile-Practices-via-MLOps.html"/>
   <updated>2023-01-09T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2023/01/09/Making-Machine-Learning-More-Effective-By-Applying-Agile-Practices-via-MLOps</id>
   <content type="html">&lt;h2 id=&quot;given-at&quot;&gt;Given at&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://codemash.org/&quot;&gt;CodeMash&lt;/a&gt; 2023&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://nebraskacode.amegala.com&quot;&gt;Nebraska.Code()&lt;/a&gt; 2022&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;You’ve decided Machine Learning (ML) can help your customers? Great! ML is very accessible these days. But taking those ML solutions into production in a way that is repeatable, maintainable, and scalable can be challenging. MLOps draws from DevOps and Agile practices to reduce these risks and improve outcomes.&lt;/p&gt;

&lt;p&gt;This talk is an introduction to MLOps, including: what it is, how it is similar &amp;amp; different from other * Ops practices, and then we’ll apply these MLOps concepts to three case studies during the session. This talk will teach attendees to recognize anti-patterns for machine learning &amp;amp; its deployment; and use Agile approaches to avoid these anti-patterns.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Solving AI Problems the Easy Way With Off the Shelf Tools</title>
   <link href="http://www.rpherbig.com/2021/09/16/Solving-AI-Problems-the-Easy-Way-With-Off-the-Shelf-Tools.html"/>
   <updated>2021-09-16T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2021/09/16/Solving-AI-Problems-the-Easy-Way-With-Off-the-Shelf-Tools</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Indy Software Artisans meetup (2021): &lt;a href=&quot;https://www.dropbox.com/scl/fo/6vjvvwo46fqej38edsa30/AFMZHK6UwxTIBE_JqrR6OYY?rlkey=dxicpia5tjvw900ixkww9cwwp&amp;amp;st=q7oxh4z2&amp;amp;dl=0&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Hearing about artificial intelligence is unavoidable these days if you’re watching the news or staying abreast of the technical sector.  We frequently hear about the power of AI-enabled tools, and are shown soundbytes of experts extolling the virtues of their approach.&lt;/p&gt;

&lt;p&gt;While these stories inform and entertain, they also create the perception that AI i s extremely difficult and exclusively the realm of experts, which simply isn’t true! These days we do not need to be an AI expert to reap the benefits of the research community. Off-the-shelf open source tools exist which are powerful enough to solve many industrial problems. In this talk we will map business problems to tools and show how to translate a problem domain into the expected input of the tool. Using these tools will help us identify development opportunities that we might have otherwise missed and save time by not re-implementing common solving techniques.&lt;/p&gt;

&lt;p&gt;In this talk, we’ll cover:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Three common problems that can be solved with AI
    &lt;ul&gt;
      &lt;li&gt;Routing vehicles around a map&lt;/li&gt;
      &lt;li&gt;Solving sudoku puzzles&lt;/li&gt;
      &lt;li&gt;Building controllers for autonomous vehicles&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Three off-the-shelf tools that can solve these problems
    &lt;ul&gt;
      &lt;li&gt;Fastdownward&lt;/li&gt;
      &lt;li&gt;Minisat&lt;/li&gt;
      &lt;li&gt;OpenAI Gym&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;The formalisms that allow us to translate the real world problems into ones these solvers recognize
    &lt;ul&gt;
      &lt;li&gt;Heuristic search&lt;/li&gt;
      &lt;li&gt;Boolean Algebra&lt;/li&gt;
      &lt;li&gt;Markov Decision Processes&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>One Lead's Journey to Successfully Improving My Software Forecasting With Monte Carlo Simulation</title>
   <link href="http://www.rpherbig.com/2021/05/25/forecasting-my-process.html"/>
   <updated>2021-05-25T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2021/05/25/forecasting-my-process</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://sep.com/blog/software-forecasting-my-process/&quot; /&gt;

&lt;h1 id=&quot;what-is-this&quot;&gt;What is this?&lt;/h1&gt;

&lt;p&gt;Forecasting is not a skill I use frequently, which means it takes me time to remember each of the steps and the small details I’ve forgotten. There’s a lot of great information out there, but reading it and refreshing my memory takes longer than I’d like it to. My goal here is to describe the process I use to make this easier in the future (i.e. not the &lt;em&gt;why&lt;/em&gt;, but the &lt;em&gt;how&lt;/em&gt;). And if someone suggests improvements to my process, all the better!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/forecasting_process.jpg&quot; alt=&quot;Forecasting Process Visualization&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Don’t worry if you aren’t familiar with some of these terms and tools - I’ll link to explanations as each is used.&lt;/p&gt;

&lt;p&gt;One final note before we get started: &lt;strong&gt;risk management and recording assumptions are a crucial part of delivery forecasting&lt;/strong&gt;. That should be done in parallel with these steps.&lt;/p&gt;

&lt;h1 id=&quot;step-1---create-the-backlog&quot;&gt;Step 1 - create the backlog&lt;/h1&gt;

&lt;p&gt;Everyone has their own way to do this part. My preferred method is Story Mapping(&lt;a href=&quot;https://www.jpattonassociates.com/user-story-mapping/&quot;&gt;Jeff Patton on User Story Mapping&lt;/a&gt;, &lt;a href=&quot;https://cardboardit.com/2019/05/hate-estimating-try-doing-a-user-story-map-instead/&quot;&gt;Hate Estimating? Try doing a User Story Map instead&lt;/a&gt;) using &lt;a href=&quot;https://miro.com/&quot;&gt;Miro&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;step-2a-optional---sample-the-backlog&quot;&gt;Step 2a (optional) - sample the backlog&lt;/h1&gt;

&lt;p&gt;A key component of a forecast is the size of the backlog. Ideally we would estimate the size of every backlog item.&lt;/p&gt;

&lt;p&gt;When that’s not feasible, we can use sampling to reduce the backlog-to-be-sized to a manageable amount (&lt;a href=&quot;https://medium.com/forecasting-using-data/sampling-an-introduction-b116d075e180&quot;&gt;Sampling, an Introduction&lt;/a&gt; and &lt;a href=&quot;https://medium.com/forecasting-using-data/sampling-probability-and-certainty-3e105e065138&quot;&gt;Sampling, probability and certainty&lt;/a&gt;, &lt;a href=&quot;https://medium.com/forecasting-using-data/sampling-applying-to-software-forecasting-a97cb10e2f23&quot;&gt;Sampling, probability and certainty&lt;/a&gt;) with a minimal impact on forecast quality. More samples means higher confidence that the samples are representative of the whole, but also takes more time to size.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Samples&lt;/th&gt;
      &lt;th&gt;Probability the next sample falls within the previously seen range&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;2&lt;/td&gt;
      &lt;td&gt;33.3%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;3&lt;/td&gt;
      &lt;td&gt;50.0%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;4&lt;/td&gt;
      &lt;td&gt;60.0%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;5&lt;/td&gt;
      &lt;td&gt;66.7%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;6&lt;/td&gt;
      &lt;td&gt;71.4%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7&lt;/td&gt;
      &lt;td&gt;75.0%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;…&lt;/td&gt;
      &lt;td&gt;…&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;11&lt;/td&gt;
      &lt;td&gt;83.3%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;…&lt;/td&gt;
      &lt;td&gt;…&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;20&lt;/td&gt;
      &lt;td&gt;90.5%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;…&lt;/td&gt;
      &lt;td&gt;…&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;30&lt;/td&gt;
      &lt;td&gt;93.5%&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;When possible I use 20 samples (90.5%), but 7 samples (75.0%) or 11 samples (83.3%) will still get good results.&lt;/p&gt;

&lt;h1 id=&quot;step-2b---estimate-the-size-of-the-sampled-backlog-items&quot;&gt;Step 2b - estimate the size of the sampled backlog items&lt;/h1&gt;

&lt;p&gt;In my experience, the best results come from splitting the backlog items “as small as possible and no smaller” - it’s easier to estimate small stories. If we can take that one step further and make them all “close enough” to the same size, we can simply use story count - no size estimation necessary.&lt;/p&gt;

&lt;p&gt;When that’s not feasible, relative sizing works well. I like to use a simple small/medium/large scale. In the following steps we’ll need numbers, however, so I use a simple scale: small (2), medium (4), large (8). You may be wondering “a small story is 2 what? hours? days?” - and the answer is that it doesn’t matter. The important part is that they express the relationship between the size of stories. As long as we’re careful to use the same units later on, the math works out.&lt;/p&gt;

&lt;p&gt;You may be wondering “aren’t these story points?”. I avoided that phrase because there’s &lt;a href=&quot;https://ronjeffries.com/articles/019-01ff/story-points/Index.html&quot;&gt;so much baggage&lt;/a&gt; around it in the Agile world. There’s no need for anything complicated here.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/t_magennis&quot;&gt;Troy Magennis&lt;/a&gt; has a &lt;a href=&quot;https://github.com/FocusedObjective/FocusedObjective.Resources/blob/master/Canvas%20and%20Forms/Size%20Assumption%20Canvas.pdf&quot;&gt;Worksheet&lt;/a&gt; with more guidance on methodology and an &lt;a href=&quot;https://medium.com/forecasting-using-data/estimating-how-big-62ec9a99ff59&quot;&gt;entire chapter in his book&lt;/a&gt; for even more depth. He also discusses the tradeoff between &lt;a href=&quot;https://twitter.com/t_magennis/status/1169308807190568960&quot;&gt;story points and item count&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;step-3---forecast-the-size-of-the-backlog&quot;&gt;Step 3 - forecast the size of the backlog&lt;/h1&gt;

&lt;p&gt;Download a copy of the &lt;a href=&quot;https://github.com/FocusedObjective/FocusedObjective.Resources/blob/master/Spreadsheets/Story%20Count%20Forecaster.xlsx&quot;&gt;Story Count Forecaster&lt;/a&gt;. This tool takes as an input the sampled backlog items and their sizes, performs a Monte Carlo analysis, and forecasts the total backlog size.&lt;/p&gt;

&lt;p&gt;On tab 2 (&lt;em&gt;Enter Features or Epics Here&lt;/em&gt;): enter the list of sampled backlog items along with their size&lt;/p&gt;

&lt;p&gt;On tab 3 (&lt;em&gt;Forecast Story Count or Points&lt;/em&gt;):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;How many total features do you want to forecast?&lt;/em&gt;: the total number of backlog items we want to forecast&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;What rate do you expect work to split?&lt;/em&gt;: enter 1.0 for both the low and high - we will account for split rate in step 4&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key here is to keep our units consistent. If the samples were sized with story points, then the output here will be in story points. If we use story count, then the output will be a number of stories. The output value is always &lt;em&gt;pre-split&lt;/em&gt; units of work (see step 4 for split rate).&lt;/p&gt;

&lt;p&gt;Choose confidence levels that match your client’s risk tolerance. Lower confidence sets the lower bound for total backlog size, similarly with higher confidence. I usually use 75% and 95%.&lt;/p&gt;

&lt;h1 id=&quot;step-4a---estimate-split-rate-growth&quot;&gt;Step 4a - estimate split rate (growth)&lt;/h1&gt;

&lt;p&gt;Experientially, I’ve found these to be good starting range for split rate:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;0.75 - 1.5 for a well-oiled team, &lt;a href=&quot;https://lizkeogh.com/2013/07/21/estimating-complexity/&quot;&gt;low complexity product&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;1.5 - 2.5 for a new team, &lt;a href=&quot;https://dannorth.net/2010/08/30/introducing-deliberate-discovery/&quot;&gt;low complexity product&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;2.5 - 3.5 for a new team, high complexity product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From that starting point, adjust up or down based on factors such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Is there a reason to expect a higher-than-normal amount of rework, defects/bugs, etc.?&lt;/li&gt;
  &lt;li&gt;Do we expect risks to be realized with less lead time or warning than usual?&lt;/li&gt;
  &lt;li&gt;Is the feedback or release cadence going to be longer or shorter than usual?&lt;/li&gt;
  &lt;li&gt;How many external dependencies does the team have?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Troy Magennis has a &lt;a href=&quot;https://github.com/FocusedObjective/FocusedObjective.Resources/blob/master/Canvas%20and%20Forms/Growth%20Assumption%20Canvas.pdf&quot;&gt;Worksheet&lt;/a&gt; with more guidance and an &lt;a href=&quot;https://medium.com/forecasting-using-data/chapter-8-estimating-what-else-scope-growth-dec308d7d37f&quot;&gt;entire chapter in his book&lt;/a&gt; for even more depth.&lt;/p&gt;

&lt;h1 id=&quot;step-4b---estimate-velocity-throughput-pace&quot;&gt;Step 4b - estimate velocity (throughput) (pace)&lt;/h1&gt;

&lt;p&gt;Velocity, throughput, and pace are closely related, but distinct, concepts which are often conflated. &lt;a href=&quot;https://observablehq.com/@troymagennis/story-point-velocity-or-throughput-forecasting-does-it-mat&quot;&gt;Each has their use&lt;/a&gt; and what is important is that &lt;strong&gt;the units are consistent with steps 2 and 3&lt;/strong&gt;. I’ll use velocity for now, but mentally substitute the other terms as it makes sense for your context. I think velocity has &lt;a href=&quot;https://twitter.com/t_magennis/status/1380304303626182657&quot;&gt;the largest impact on the accuracy of forecasts&lt;/a&gt;, so it’s worth taking some time to get reasonable values here.&lt;/p&gt;

&lt;p&gt;It’s best to use historical data when possible, &lt;strong&gt;if that historical data is recent&lt;/strong&gt;. If that isn’t available, this is a guess based on experience. Either way it must be in the same units as backlog size. For time I usually use one week to simplify communication with the client. This is just for expectation setting, and the actual development effort can be done in weeks, sprints, etc.&lt;/p&gt;

&lt;p&gt;Once we have a baseline velocity, adjust up or down based on factors such as:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Will all of the team be starting on day 1, or is there a ramp up period of time?&lt;/li&gt;
  &lt;li&gt;Will the team members be working solo, in pairs, a mob, or some other style?&lt;/li&gt;
  &lt;li&gt;Are there any constrained or only partially available team members?&lt;/li&gt;
  &lt;li&gt;How many external dependencies does the team have?&lt;/li&gt;
  &lt;li&gt;Is there any known time off (holidays, vacations, etc.)?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Speaking of &lt;a href=&quot;https://twitter.com/t_magennis/status/1388581947178328065&quot;&gt;external dependencies&lt;/a&gt;, identifying and understanding them is a &lt;a href=&quot;https://twitter.com/t_magennis/status/999489948183969792&quot;&gt;prerequisite for forecasting&lt;/a&gt;. If that wasn’t done as part of step 1, spend some time on that before proceeding.&lt;/p&gt;

&lt;p&gt;Troy Magennis has a &lt;a href=&quot;https://github.com/FocusedObjective/FocusedObjective.Resources/blob/master/Canvas%20and%20Forms/Pace%20Assumption%20Canvas.pdf&quot;&gt;Worksheet&lt;/a&gt; with more guidance.&lt;/p&gt;

&lt;h1 id=&quot;step-4c---forecasting-the-delivery&quot;&gt;Step 4c - forecasting the delivery&lt;/h1&gt;

&lt;p&gt;Download a copy of the &lt;a href=&quot;https://github.com/FocusedObjective/FocusedObjective.Resources/blob/master/Spreadsheets/Throughput%20Forecaster.xlsx&quot;&gt;Throughput Forecaster&lt;/a&gt;. This tool takes as an input the backlog size, split rate, and velocity, performs a Monte Carlo analysis, and forecasts the duration with varying levels of confidence (answering the question “how long will it take to build this backlog?”). If the client instead wants to know “what scope can I get with a fixed budget?”, use the &lt;a href=&quot;https://github.com/FocusedObjective/FocusedObjective.Resources/blob/master/Spreadsheets/Multiple%20Feature%20Cut%20Line%20Forecaster.xlsx&quot;&gt;Multiple Feature Cut Line Forecaster&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On tab 2 (&lt;em&gt;Forecast&lt;/em&gt;):&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Start Date&lt;/em&gt;: use what makes sense - what really matters to most clients is cost, which is driven by duration&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;How many stories are remaining to be completed?&lt;/em&gt;: the total backlog size range from step 3&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Stories are often split before and whilst being worked on. Estimate the split rate low and high bounds.&lt;/em&gt;: the split rate range from step 4a&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Throughput. How many completed stories per week or sprint do you estimate low and high bounds?&lt;/em&gt;: the velocity range from step 4b&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Throughput/velocity data or estimate is for&lt;/em&gt;: use the same units for time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output is a range of durations based on confidence/likelihood.&lt;/p&gt;

&lt;h1 id=&quot;step-5---delivering-the-forecast&quot;&gt;Step 5 - delivering the forecast&lt;/h1&gt;

&lt;p&gt;At this point, we have a forecast of duration (i.e. a range of durations along with their likelihood), therefore we can forecast cost. If we have a likely start date, we can also forecast the delivery date. However, none of this is useful unless we can communicate it to the client.&lt;/p&gt;

&lt;p&gt;The most straightforward deliverables would be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A representation of the backlog that was used in the forecast (e.g. a story map with “in this release” and “out of this release” clearly delineated)&lt;/li&gt;
  &lt;li&gt;The forecast - duration, cost, date
    &lt;ul&gt;
      &lt;li&gt;Assumptions that are integral to forecasting - consistent team size, uniform distribution of split rate and velocity, etc.&lt;/li&gt;
      &lt;li&gt;Assumptions and risks are specific to this forecast - e.g. does the team need hardware or an environment to start working on a feature?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1c4cPlKC2WPLsGfn8j-fPve-mmyco_O56lPd0Wr6_2S0/&quot;&gt;How forecasting works&lt;/a&gt; and what confidence means (i.e. how to interpret the likelihood of the forecast range)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the client is already familiar with forecasting, we could even give them the tools (e.g. spreadsheets, estimates, etc.) used above.&lt;/p&gt;

&lt;p&gt;However, my team has been experimenting with some other ways to communicate the results, which I’ll cover in a future blog post.&lt;/p&gt;

&lt;h1 id=&quot;suggested-reading&quot;&gt;Suggested reading&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/forecasting-using-data/forecasting-828f31c22514&quot;&gt;What is forecasting?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/forecasting-using-data/forecasting-strategy-de66f584b4da&quot;&gt;How does forecasting work?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/forecasting-using-data/size-growth-pace-model-b6bbf73249c8&quot;&gt;Is forecasting better than estimation? When is forecasting the right technique to use?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Internal wiki: &lt;a href=&quot;https://sepedia.net.sep.com/wiki/Forecasting&quot;&gt;Forecasting&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Internal wiki: &lt;a href=&quot;https://sepedia.net.sep.com/wiki/Monte_Carlo_Forecasting_for_Clients&quot;&gt;Monte Carlo Forecasting for Clients&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.dropbox.com/sh/fk9qm3wvkx1i2mq/AAB6a5lEhy7H-zv_gpvKuw11a?dl=0&quot;&gt;Assumption Canvases&lt;/a&gt; by SEP&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Avoiding False Starts with Artificial Intelligence</title>
   <link href="http://www.rpherbig.com/2020/06/29/avoiding-false-starts-with-ai.html"/>
   <updated>2020-06-29T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2020/06/29/avoiding-false-starts-with-ai</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://www.sep.com/sep-blog/2020/06/29/avoiding-false-starts/&quot; /&gt;

&lt;p&gt;&lt;img src=&quot;/images/baton_runner.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;avoiding-false-starts-with-artificial-intelligence&quot;&gt;Avoiding False Starts with Artificial Intelligence&lt;/h1&gt;

&lt;p&gt;Artificial Intelligence (AI) is no longer science fiction; it’s here today, and it’s here to stay. It is in the products you use every day: home automation, digital assistants, and credit card fraud detection, to name a few.&lt;/p&gt;

&lt;p&gt;AI will affect all businesses in the near future, and the impact will be significant. The only remaining question is: &lt;em&gt;how do I get started?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There can be a steep learning curve when first using AI. There are three reasons for this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Many of our natural assumptions around AI are wrong.&lt;/li&gt;
  &lt;li&gt;Expectations around the development process don’t match reality.&lt;/li&gt;
  &lt;li&gt;Explainability is rarely considered when developing an AI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet, by carefully considering these ideas, everyone can succeed in using artificial intelligence.&lt;/p&gt;

&lt;h1 id=&quot;five-faulty-assumptions&quot;&gt;Five Faulty Assumptions&lt;/h1&gt;

&lt;p&gt;When we first start working with artificial intelligence, it’s easy to make assumptions about how it works. Here are five common, but faulty, assumptions we should avoid.&lt;/p&gt;

&lt;h2 id=&quot;1-ai-has-general-human-capabilities&quot;&gt;1. AI has general human capabilities&lt;/h2&gt;

&lt;p&gt;We expect an artificial intelligence to be able to do the same things a human can do. Said another way, what’s easy for humans should be easy for a machine. A human can see an object on the ground and pick it up. However, this is a very challenging task for a machine. It must see the object, understand what it’s seeing, determine how the object will react when it is manipulated (will it deform, is it rigid, etc.), and then decide how it’s going to act. You can see this process in action &lt;a href=&quot;https://www.youtube.com/watch?v=gy5g33S0Gzo&quot;&gt;with this video&lt;/a&gt; of a towel folding robot. Keep in mind it’s sped up 50x, so the robot takes close to an hour to fold two towels.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.aboutamazon.com/amazon-fulfillment/our-innovation/what-robots-do-and-dont-do-at-amazon-fulfillment-centers/&quot;&gt;Amazon had to deal with this same assumption when building its warehouses&lt;/a&gt;. Machines do what they are good at (heavy lifting, transporting shelves around the warehouse quickly); humans do what they are good at (verifying the items brought to them, making in-the-moment decisions). The key is to recognize a machine’s strengths and a human’s strengths to build a system that complements both.&lt;/p&gt;

&lt;h2 id=&quot;2-ai-understands-the-context-in-which-its-being-used&quot;&gt;2. AI understands the context in which it’s being used&lt;/h2&gt;

&lt;p&gt;An AI only understands the context (inputs), it is given and nothing more. One such &lt;a href=&quot;https://www.youtube.com/watch?v=P18EdAKuC1U&quot;&gt;example is IBM’s Watson.&lt;/a&gt; Watson was specifically built to compete on Jeopardy. However, it wasn’t told the category for each clue, &lt;a href=&quot;https://www.youtube.com/watch?v=Y2wQQ-xSE4s&quot;&gt;which sometimes caused it to answer wrong&lt;/a&gt;. Watson was missing that critical piece of context.&lt;/p&gt;

&lt;p&gt;Another example is when a &lt;a href=&quot;https://dl.acm.org/doi/10.1145/2939672.2939778&quot;&gt;research team built an app to determine whether an image was of a wolf or a dog&lt;/a&gt;. While It seemed to work, it was actually detecting snow versus grass. Because most of the input images of wolves were in the snow and of dogs were in a park, it had learned the wrong concept. While humans intuitively know that we want to differentiate the animal in the picture, and not the background, the AI did not since it was not told the context of the problem. In the end it was a snow detector rather than a wolf detector. The solution was to remove the background of every photo; thereby the AI learned what was important (the wolf or the dog).&lt;/p&gt;

&lt;h2 id=&quot;3-automation-is-an-all-or-nothing-proposition&quot;&gt;3. Automation is an all or nothing proposition&lt;/h2&gt;

&lt;p&gt;It is natural to think that if we’re automating a process, we need to automate the entire process; otherwise, it’s not worth the time or effort. But that’s not always an efficient use of humans or machines. As we saw in Faulty Assumption #1, supplementing a machine’s capabilities with the human’s abilities is the best of both worlds.&lt;/p&gt;

&lt;p&gt;In the medical field where accuracy is essential, it’s been found that &lt;a href=&quot;https://ieeexplore.ieee.org/document/8861376&quot;&gt;a combination of doctors plus AIs&lt;/a&gt; have a better rate than either have by themselves:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Our study found that AI detected pixel-level changes in tissue invisible to the human eye, while humans used forms of reasoning not available to AI. The ultimate goal of our work is to augment, not replace, human radiologists.&lt;/p&gt;

  &lt;p&gt;– Krzysztof Geras, assistant professor in the radiology department at New York University’s Grossman School of Medicine, &lt;a href=&quot;https://www.futurity.org/artificial-intelligence-breast-cancer-detection-2261322/&quot;&gt;AI boosts breast cancer detection accuracy&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And of course, a cancer diagnosis (or non-diagnosis) is better delivered by a human who can empathize with the patient.&lt;/p&gt;

&lt;h2 id=&quot;4-ai-systems-are-unbiased&quot;&gt;4. AI Systems are unbiased.&lt;/h2&gt;

&lt;p&gt;AI in their pure mathematical status should be unbiased, but that is untrue. As we saw in Faulty Assumption #2, the wolf detector had biased input data, so it was answering the wrong question.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.telegraph.co.uk/technology/2019/09/19/racist-passport-photo-system-rejects-image-young-black-man-despite/&quot;&gt;Another example comes from the UK passport system&lt;/a&gt;. The system was set up to recognize specific criteria and approve the passport photo only when all criteria were met. Pretty straightforward, in theory. But the system rejected some acceptable passport photos because of a fault in its input data. Human faces come in all shapes, sizes, and colors and the system simply didn’t have enough examples in its database to correctly identify acceptable passport photos every time.&lt;/p&gt;

&lt;p&gt;When humans are involved, it is easy for their biases to be present in the input data they gather. Algorithms themselves do not have bias; however data does. So, if the input data has biases, then the AI will have biases. We must be careful to guard against this by training the AI on data which is representative of everyone who could use the system.&lt;/p&gt;

&lt;h2 id=&quot;5-ai-means-intelligence-as-humans-understand-it&quot;&gt;5. AI means intelligence as humans understand it&lt;/h2&gt;

&lt;p&gt;We tend to believe the “intelligence” in “artificial intelligence” is the same as in “human intelligence”; that an AI goes through the same thought process as a human to get to the solution. But AI approaches problems differently than humans. It is made up of a pile of algorithms and it follows those to a conclusion. It might be the same conclusion that a human would make, but how it arrived at that conclusion is very different. This distinction can be a great advantage. Computers can be unconstrained from past knowledge and strategy, and therefore really challenge how humans think.&lt;/p&gt;

&lt;p&gt;For example, the game of &lt;a href=&quot;https://en.wikipedia.org/wiki/Go_(game)&quot;&gt;Go is a strategy board game&lt;/a&gt;, much more complex than Chess. It has been around for thousands of years and in that time, humans have established strategies for play. Google’s &lt;a href=&quot;https://deepmind.com/research/case-studies/alphago-the-story-so-far&quot;&gt;AlphaGo&lt;/a&gt; changed the way humans look at the game when it &lt;a href=&quot;https://www.wired.com/2016/03/sadness-beauty-watching-googles-ai-play-go/&quot;&gt;won a match against Lee Sedol&lt;/a&gt;, one of the world’s top players, by making a completely unexpected move. AlphaGo never would have made this move if it had stuck to conventional human strategies, but it was unencumbered by the past and came up with a new way of ‘thinking’ about the game.&lt;/p&gt;

&lt;h1 id=&quot;an-iterative-and-experimental-process&quot;&gt;An iterative and experimental process&lt;/h1&gt;

&lt;p&gt;Along with the assumptions, it’s important to approach the development of artificial intelligence in an iterative fashion, with an experimental mindset.&lt;/p&gt;

&lt;p&gt;First, let’s define two terms:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Utility&lt;/em&gt; is the reason we’re interested in building AI: higher accuracy, less processing time, faster development time, or any of the myriad reasons we have.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Investment&lt;/em&gt; is whatever you spend to achieve a goal: headcount, budget, time, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We have found that development typically follows an S-curve with 3 distinct phases.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/ml_investment_curve_release.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;First, the feasibility phase (highlighted in blue). The goal of this phase is to determine if it can be done at all. Can we build Data from Star Trek? No - and we can find that out quickly. If this problem inherently can’t be solved, the curve will remain flat. If it can be done, the S-curve will start to form.&lt;/p&gt;

&lt;p&gt;Second, the initial development phase (highlighted in purple). The goal of this phase is to determine if we can afford to build it. If the curve starts to rise sharply, we’re on the right track. This probably involves trying several different techniques and approaches to see what tradeoffs each have on this specific problem (see the next section for more on that).&lt;/p&gt;

&lt;p&gt;Lastly, the polish phase (highlighted in orange). The goal of this phase is to determine if it’s ready to release. In this phase, the major development is finished; it’s just finishing those last bits of fine tuning and putting the finishing touches to ensure the product is ready to be used. While seemingly simple, it unfortunately takes a lot of time, leading to the level off of the curve. As a result, it’s up to you to choose when the product is ready for release. There’s no right or wrong answer, rather the question of: is this good enough for my purpose? If so, then it’s ready to go!&lt;/p&gt;

&lt;p&gt;Admittedly, there is one more phase after the polish phase that is rarely considered: maintenance. Maintaining the system: knowing when to retrain, when to update the algorithm, what data to keep or throw away, also requires time and effort. Just like in the polish phase, these questions have no right answer. It’ll be your choice when to do further maintenance and when it’s enough for your purposes.&lt;/p&gt;

&lt;h1 id=&quot;tradeoff-utility-versus-explainability&quot;&gt;Tradeoff: utility versus explainability&lt;/h1&gt;

&lt;p&gt;There’s one more term to define: &lt;em&gt;explainability&lt;/em&gt;. &lt;a href=&quot;https://en.wikipedia.org/wiki/Explainable_artificial_intelligence&quot;&gt;Explainable artificial intelligence&lt;/a&gt; is when the AI system produces a solution understandable by a human expert (and ideally even a layperson). Furthermore, how the AI arrived at that solution can be understood. Contrast that with the concept of “black box” AI where even the system’s designers cannot explain why the AI arrived at a specific decision.&lt;/p&gt;

&lt;p&gt;Why does explainability matter?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Understanding why a decision is made helps detect bias earlier, like the passport photo verification system we saw in Faulty Assumption #4. People can evaluate whether there are any issues in the system early on and adjust accordingly.&lt;/li&gt;
  &lt;li&gt;Understanding how a decision is made helps with determining accountability. For example, if someone is misdiagnosed in the situation we saw in Faulty Assumptions #3, breast cancer diagnosis, accountability becomes a big question. &lt;a href=&quot;https://www.statnews.com/2020/03/09/can-you-sue-artificial-intelligence-algorithm-for-malpractice/&quot;&gt;AI algorithms themselves can’t really be sued&lt;/a&gt;, but depending on the situation, related parties can. While explainability doesn’t say in black and white who should be held accountable, it does still help.&lt;/li&gt;
  &lt;li&gt;Understanding how decisions are made helps developers fix issues. Consider the case of the wolf detector from Faulty Assumption #2. If the designers knew the system was putting more weight on the background, they would have found the solution of removing the background from photos much quicker.&lt;/li&gt;
  &lt;li&gt;Having explainability helps build trust with the people using the AI. If someone knows the reasons an AI arrived at a decision, then they can decide whether they trust those reasons and therefore trust the AI. Without explainability, users have to trust the creators that it works.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/images/utility-vs-explainability.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, what’s the tradeoff? Well, per the picture above, &lt;em&gt;in general&lt;/em&gt; the more powerful the AI technique, the less explainable it is. This is not an exhaustive list of AI techniques, nor is this rule universally applicable. But it &lt;em&gt;is&lt;/em&gt; consistent enough that we need to be careful of it. There is a lot of ongoing research in this area.&lt;/p&gt;

&lt;p&gt;Now, not every AI system needs to be explainable, but that decision must be deliberate. Think of explainability as a non-functional requirement to be explored in the feasibility phase of development.&lt;/p&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;It may seem like a lot to think about, but in the end there’s only a few core ideas to remember:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fix Faulty Assumptions
    &lt;ol&gt;
      &lt;li&gt;AI does &lt;em&gt;not&lt;/em&gt; have the same capabilities as humans: AI and humans each have different strengths.&lt;/li&gt;
      &lt;li&gt;AI does &lt;em&gt;not&lt;/em&gt; understand context: AI needs to be told exactly what it needs.&lt;/li&gt;
      &lt;li&gt;Automation is &lt;em&gt;not&lt;/em&gt; all or nothing: sometimes the best solution is to use both AI and humans.&lt;/li&gt;
      &lt;li&gt;Algorithms &lt;em&gt;can&lt;/em&gt; be biased: be careful of what the inputs are.&lt;/li&gt;
      &lt;li&gt;AI does &lt;em&gt;not&lt;/em&gt; mean intelligence as we understand it: AI has a very different process, following algorithms rather than human thought processes.&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Practice Iterative Development; watch the slope of the S-curve during each phase and understand what it tells you about the problem you’re solving.&lt;/li&gt;
  &lt;li&gt;Deliberately Consider Tradeoffs; learn what level of more utility comes at the cost of explainability is necessary for your product and how that impacts which techniques are feasible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we accept that we need to take an experimental approach to building AI, that failures will happen, and constantly improve iteratively, success will come with it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Title Goes Here</title>
   <link href="http://www.rpherbig.com/2020/05/26/title-goes-here.html"/>
   <updated>2020-05-26T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2020/05/26/title-goes-here</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://www.sep.com/sep-blog/2020/05/26/title-goes-here/&quot; /&gt;

&lt;p&gt;&lt;img src=&quot;/images/blank_painting.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Creating something brand new is hard. No matter if it’s a painting, a system architecture, or a conference talk, the creative effort of conjuring up something from nothing is difficult. Take me for example, staring at a text editor, trying to figure out what to type next and think up a clever title.&lt;/p&gt;

&lt;p&gt;Writers know this as the &lt;a href=&quot;https://www.brainpickings.org/2016/09/13/writers-blank-page/&quot;&gt;Blank Page&lt;/a&gt;, painters as the &lt;a href=&quot;https://www.themodernnomad.com/blank-canvas-paralysis/&quot;&gt;Blank Canvas Problem&lt;/a&gt;. Regardless of the name, we’ve all encountered the phenomenon at some point. It’s that anxiety that comes from having an &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Paradox_of_Choice&quot;&gt;infinite number of choices&lt;/a&gt; for the next step.&lt;/p&gt;

&lt;h2 id=&quot;ok-rob-where-are-you-going-with-this&quot;&gt;Ok Rob, where are you going with this?&lt;/h2&gt;

&lt;p&gt;A colleague of mine is kicking off a new software project with a new team. We got to talking about what the team needs to do in this situation and I had to sit down and really think about it for a few minutes. &lt;a href=&quot;https://en.wikipedia.org/wiki/Argument_from_authority&quot;&gt;I’ve been doing this for a while now&lt;/a&gt; and I’m used to &lt;a href=&quot;https://en.wikipedia.org/wiki/Shuhari&quot;&gt;just doing it&lt;/a&gt;, not articulating the &lt;em&gt;why&lt;/em&gt; of it, thus this blog post.&lt;/p&gt;

&lt;p&gt;Just as a baby’s first years have a huge impact on their development, a team’s first steps have a huge impact on its long-term growth. It’s the most critical time for a nascent team. I’m not just talking about a &lt;a href=&quot;https://thedigitalprojectmanager.com/project-kickoff-meeting/&quot;&gt;Project Kickoff meeting&lt;/a&gt;, I’m talking about the first few weeks of a team. &lt;/p&gt;

&lt;h2 id=&quot;start-with-the-principles&quot;&gt;Start with the Principles&lt;/h2&gt;

&lt;p&gt;A new team has two &lt;em&gt;immediate&lt;/em&gt; goals - there’s a feedback loop between the two so it can be hard to separate them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Getting work to flow; and&lt;/li&gt;
  &lt;li&gt;Building a team out of individuals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Getting work to flow&lt;/em&gt; is Agile in the &lt;a href=&quot;https://agilemanifesto.org/&quot;&gt;purest sense&lt;/a&gt;. Get work flowing through the process, check it with the customer, figure out what needs to change, and then change it.&lt;/p&gt;

&lt;p&gt;Why is &lt;em&gt;building a team out of individuals&lt;/em&gt; equally important? Delivering working software is all that matters, right?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/well_yes_but_actually_no.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Fully half of the Agile Manifesto’s Principles are about people, because that’s how we get long-term success. To really “figure out what needs to change” and “then change it” requires more than just a collection of individuals, &lt;a href=&quot;http://eleganthack.com/design-the-team-you-need-to-succeed/&quot;&gt;it requires a team&lt;/a&gt;. That doesn’t happen by accident.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The researchers found that what really mattered was less about who is on the team, and more about how the team worked together.&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://rework.withgoogle.com/print/guides/5721312655835136/&quot;&gt;re:Work&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;principles-beget-a-process&quot;&gt;Principles beget a Process&lt;/h2&gt;

&lt;p&gt;Just like Scrum is a process for implementing the Principles of Agile, this is the Process for the above Principles (the &lt;em&gt;what&lt;/em&gt;, not &lt;em&gt;how&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;First, when getting work to flow, do the simplest thing that could possibly work. Rinse and repeat. It’s not easy, but it is straightforward. The most important thing is to break the “Blank Canvas” effect, deliver something, and show progress.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In Dual Track Development and a project starting up, your demos might be a prototype, and not working code. That’s ok. The point is to show progress.&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://www.linkedin.com/in/whoispoppe&quot;&gt;Poppe Guthrie&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Second, make it safe for teammates to talk to each other. Psychological safety, trust, vulnerability, and shared vocabulary are the keywords here. As a team lead with a team of excellent engineers, I consider that my primary job responsibility. If I can help the team be safe, they’ll self-organize and do things better than I could have imagined. If someone is feeling that “paradox of choice” anxiety, my job is to give them confidence that things will get better in time.&lt;/p&gt;

&lt;p&gt;Third, create an &lt;em&gt;intelligence&lt;/em&gt; system - one in which accurate, real-time information is distributed broadly and quickly, and presented in detail. The key point is that team members can see and react to patterns and decide what to do. If you’ve read the book &lt;em&gt;&lt;a href=&quot;https://smile.amazon.com/Nine-Lies-about-Work-Freethinking-ebook/dp/B07C3ZT28C&quot;&gt;Nine Lies About Work&lt;/a&gt;&lt;/em&gt; (which I highly recommend) this should sound familiar.&lt;/p&gt;

&lt;p&gt;Each practice I’m going to talk about has worked for me in the past. Not every one is right for every team, they are simply tools in my toolbox. If you don’t like unsolicited advice, feel free to skip to the end.&lt;/p&gt;

&lt;h2 id=&quot;getting-work-to-flow&quot;&gt;Getting work to flow&lt;/h2&gt;

&lt;p&gt;I’m a big fan of visualizing everything, so I start with a Kanban board. My default board has only three columns: “To-do”, “Doing”, and “Done”. Nothing fancy. If you’ve got a physical board, make it as impermanent as possible, since that makes it more likely people will change it.&lt;/p&gt;

&lt;p&gt;What about code reviews? Pull requests? Squash or rebase or merge? Doesn’t matter yet. Avoid long drawn-out conversations - find a starting point and move on.  Remember, everything can be changed. It’s all an experiment. We’re just finding a starting point to iterate on later. This is a good time to introduce the concept of &lt;a href=&quot;https://www.inc.com/justin-bariso/it-took-jeff-bezos-only-three-words-to-drop-the-best-advice-youll-hear-today.html&quot;&gt;disagree and commit&lt;/a&gt;. Just don’t let that be an excuse for someone to dominate decision-making.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://www.atlassian.com/team-playbook/plays/roles-and-responsibilities&quot;&gt;roles &amp;amp; responsibilities activity&lt;/a&gt; is multi-purpose. It can:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Set expectations amongst the team for who is responsible for what&lt;/li&gt;
  &lt;li&gt;Make sure there are no gaps (e.g. a responsibility which is missing an owner)&lt;/li&gt;
  &lt;li&gt;Surface conversations that weren’t being had (I’ve heard this called “unstated conflict”)&lt;/li&gt;
  &lt;li&gt;Identify places in which people are looking to try new things on the project (growth opportunities)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;building-a-team-out-of-individuals&quot;&gt;Building a team out of individuals&lt;/h2&gt;

&lt;p&gt;Pick a team name. I’ve never met anyone strongly &lt;em&gt;against&lt;/em&gt; the practice (at worst is mild apathy). Some people really get into it. It’s a short activity which gets the team focused on the same task. It’s low risk since the name can always be changed later. And at the end, the team has a name around which it can establish a team identity.&lt;/p&gt;

&lt;p&gt;Psychological safety means individuals feel confident they won’t be embarrassed or punished for admitting a mistake, asking a question, or offering a new idea.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Watch carefully for those to happen and treat them as a learning opportunity. Have a meta-conversation (i.e. “let’s talk about how we talk”) or an impromptu retrospective on the interaction.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://www.tablegroup.com/download/personal-histories-exercise/&quot;&gt;Personal Histories Exercise&lt;/a&gt; is great for learning more about your teammates and reminding yourself that they, too, are human.&lt;/li&gt;
  &lt;li&gt;Have some paid-for team meals. This encourages participation in the exercises and activities. If you don’t have an agenda, I like to get out of the office. Think of the cost of the meal as an investment in the long-term health of the team. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shared vocabulary is necessary to make sure what people are saying is what others are hearing.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I like &lt;a href=&quot;https://www.tablegroup.com/books/dysfunctions/&quot;&gt;The Five Dysfunctions of a Team&lt;/a&gt; as a starting point for a shared mental model for our goals as a team. It doesn’t take long to describe and I haven’t met anyone yet that strongly disagreed with it. The goal here is not a perfect prescriptive model, it’s to establish shared concepts.&lt;/li&gt;
  &lt;li&gt;The &lt;a href=&quot;https://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development&quot;&gt;Tuckman model&lt;/a&gt; of group development resonates with many teams. It sets the team’s expectations for how it will change over time. Progression between stages is often described as linear, when in reality a team may move back-and-forth between stages.&lt;/li&gt;
  &lt;li&gt;Talking about the &lt;a href=&quot;https://en.wikipedia.org/wiki/Fundamental_attribution_error&quot;&gt;fundamental attribution error&lt;/a&gt; gives the team a way to hold each other accountable.&lt;/li&gt;
  &lt;li&gt;If yours is a team which likes feedback, consider the &lt;a href=&quot;https://mbainventory.com/&quot;&gt;Motivating by Appreciation Inventory&lt;/a&gt;. It helps people understand how to give &amp;amp; show appreciation and deliver &amp;amp; receive feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Be deliberate about building communication norms. It’s likely that some of these people have never worked together before.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I like to start with a “no interruptions” rule based on re:Work and Google’s &lt;a href=&quot;https://www.inc.com/robin-camarote/google-study-reveals-emotional-intelligence-on-teams-determines-success.html&quot;&gt;Project Aristotle&lt;/a&gt;. This is the first step to ensuring everyone has a chance to talk and for approximately equal time. It’s not an excuse for one person to dominate the conversation by speaking for too long.&lt;/li&gt;
  &lt;li&gt;I’ve been on several teams which adopted the above practice. Another that goes well with it (to assist with “conversational turn-taking”) is holding up your index finger to show you would like to speak next. “Jim, what you have to say is important. Jane raised her finger first. Jane, please go ahead and Jim will talk next.” &lt;em&gt;and everyone nods&lt;/em&gt;!&lt;/li&gt;
  &lt;li&gt;I was on a team once in which we were spending a lot of time arguing over minutiae. Asking “on a scale of one-to-ten, &lt;a href=&quot;https://capwatkins.com/blog/the-sliding-scale-of-giving-a-fuck&quot;&gt;how many cares do you have to give&lt;/a&gt; about this topic?” was extremely effective at focusing our discussions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shake up the team rituals&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Let standup run long. Bear with me here, I know this is heresy to some. I’m not saying spend an hour on standup. I am saying that new teammates have different experiences and are used to different styles of standup. Let some friction build up, lean into it, bring it up for conversation, and focus on outcomes. Remind people that what worked on past teams may not work here.&lt;/li&gt;
  &lt;li&gt;One Scrum team decided to start with two Retrospectives per Sprint. One was the &lt;a href=&quot;https://www.scrum.org/resources/what-is-a-sprint-retrospective&quot;&gt;typical Sprint Retrospective&lt;/a&gt;, the other was mid-Sprint and focused team cohesion and long-term growth. When the team felt they were Performing (to use Tuckman’s term) they scaled back to one Retrospective per Sprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;building-an-intelligence-system&quot;&gt;Building an intelligence system&lt;/h2&gt;

&lt;p&gt;Here is my take on chapter 2 from &lt;em&gt;&lt;a href=&quot;https://smile.amazon.com/Nine-Lies-about-Work-Freethinking-ebook/dp/B07C3ZT28C&quot;&gt;Nine Lies About Work&lt;/a&gt;&lt;/em&gt;, how a team lead can create an intelligence system:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;Liberate information&lt;/em&gt;. Think about all of the sources of information you have and make them available to the team, on demand. Don’t constrain information to those who “need to know”. Don’t worry about whether the team will understand the data or be able to make use of it.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Ensure accuracy of data&lt;/em&gt;. Don’t worry about making the data simple or easy to consume. The biggest challenge isn’t making sense of data - we deal with complexity all the time and are good at it. It’s accuracy. Clean data is essential.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Trust the team&lt;/em&gt; to make sense of the data. We are not the best sense makers. The team is.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Watch carefully&lt;/em&gt; to see which data the team finds useful. Over time, increase the volume, depth, and speed of that sort of data.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Let’s recap:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Get work to flow with the simplest process that could possibly work&lt;/li&gt;
  &lt;li&gt;Be deliberate about moving from a group of individuals to a team&lt;/li&gt;
  &lt;li&gt;Surface accurate data to the team and let the team make decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;/images/your_opinion.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, what’s your approach? What principles, processes, and practices have you found effective? Drop me a line and let’s chat.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>What Does It Mean to be a Senior Engineer?</title>
   <link href="http://www.rpherbig.com/2020/05/11/what_does_it_mean_to_be_a_senior_engineer.html"/>
   <updated>2020-05-11T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2020/05/11/what_does_it_mean_to_be_a_senior_engineer</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://www.sep.com/sep-blog/2020/05/11/what-does-it-mean-to-be-a-senior-engineer/&quot; /&gt;

&lt;p&gt;&lt;img src=&quot;/images/SEP-Around-the-Office-01-2019-108.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As a team lead, I coach and mentor many junior engineers. One topic that always comes up is “What does it mean to be a Senior Engineer?” That’s easy, you just… have a four-year degree from an accredited college? Work for 10 years and don’t get fired? Learn 3 front-end technologies? Check some boxes on a promotion form?&lt;/p&gt;

&lt;p&gt;Defining what it means to be a Senior Engineer is an impossible task. If you talk to 10 people you’ll get 11 different opinions. It’s tempting to reduce an undefinable thing to &lt;a href=&quot;https://en.wikipedia.org/wiki/I_know_it_when_I_see_it&quot;&gt;“I know it when I see it”&lt;/a&gt;. Unfortunately, that makes it too easy to inject bias. Instead, let’s discuss three traits I have observed in excellent Senior Engineers. These traits are not fundamental to their Senior Engineer-ness. That is, you wouldn’t see them on performance reviews or job descriptions. Despite this, these traits are fundamental to their excellent performance as Senior Engineers.&lt;/p&gt;

&lt;h2 id=&quot;grow-those-around-them&quot;&gt;Grow Those Around Them&lt;/h2&gt;

&lt;p&gt;I can’t stress the following enough: &lt;a href=&quot;https://royrapoport.blogspot.com/2017/02/the-three.html&quot;&gt;being right is not enough&lt;/a&gt;. It isn’t enough for the Senior Engineer to know the right answer. It isn’t enough for them to know and execute the right answer. It isn’t even enough for them to know the right answer and help a more junior engineer implement it.&lt;/p&gt;

&lt;p&gt;People often come to Senior Engineers for help. When that happens, an excellent Senior Engineer thinks “How do I teach them to solve this problem the next time it happens?”. &lt;a href=&quot;https://agilevelocity.com/agile-training/training-return-investment/&quot;&gt;Investing in your team yields amazing returns&lt;/a&gt;. Training up our team means they can handle more problems without calling us. For example, while we’re on vacation.&lt;/p&gt;

&lt;h2 id=&quot;comfortable-with-uncertainty&quot;&gt;Comfortable With Uncertainty&lt;/h2&gt;

&lt;p&gt;Senior Engineers increasingly find themselves dealing problems for which there is no “right” answer. Systems engineering and integration, architecture, multi-team organization. There are no unit tests for that. At best there are varying degrees of “right enough” for the situation. If you’re familiar with the &lt;a href=&quot;https://en.wikipedia.org/wiki/Cynefin_framework&quot;&gt;Cynefin framework&lt;/a&gt;, this is the Complex domain of “unknown unknowns”.&lt;/p&gt;

&lt;p&gt;This means the best Senior Engineers live a fascinating contradiction. They are confident that they can solve any problem. Simultaneously, they are uncertain they already know the best way to solve it. Living this dichotomy is a conscious effort to mitigate the &lt;a href=&quot;https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect&quot;&gt;Dunning–Kruger effect&lt;/a&gt;. Good engineers are aware of the Dunning-Kruger effect. Senior Engineers work hard to avoid its pitfalls.&lt;/p&gt;

&lt;p&gt;Being comfortable with uncertainty is essential when investigating unknowns. This is often where the most difficult problems lie, and where we can reap the greatest rewards. Investigative tasks are often poorly-defined. Even with a good definitions, exploring the unknown has many unanswerable questions.&lt;/p&gt;

&lt;p&gt;For example, how long should we investigate one option before pivoting to another? Too little time means we missed some easy gains. Too much time and we’ve spent too much for an incremental gain. No one can know ahead of time how long is appropriate. A Senior Engineer has to be comfortable with making that determination.&lt;/p&gt;

&lt;h2 id=&quot;curiosity-mindset&quot;&gt;Curiosity Mindset&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;I have something to learn from everyone I meet.&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://www.linkedin.com/in/david-mott-sse/&quot;&gt;Dave Mott&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are many ways to name the following concept. Which resonates with you will depend on your personal lens. “&lt;a href=&quot;https://www.harvardbusiness.org/the-importance-of-being-curious/&quot;&gt;Curiosity mindset&lt;/a&gt;” or “&lt;a href=&quot;https://www.brainpickings.org/2014/01/29/carol-dweck-mindset/&quot;&gt;growth mindset&lt;/a&gt;” resonate with some; others prefer “humility” or “&lt;a href=&quot;http://blog.stephenwyattbush.com/2012/04/07/dad-and-the-ten-commandments-of-egoless-programming&quot;&gt;egolessness&lt;/a&gt;”. Whatever you call it, what is important is to be aware of your assumptions and biases. Moreso, to be aware that you must question those assumptions and biases routinely.&lt;/p&gt;

&lt;p&gt;When a junior engineer doesn’t believe an excellent Senior Engineer, the Senior Engineer must not get defensive, but curious. The Senior Engineer is curious about why others have a different belief. Disagreement isn’t an opportunity to prove someone wrong. It’s an opportunity to understand why they have a belief and show them another option. Further, a Senior Engineer is curious about why they hold the beliefs they do.&lt;/p&gt;

&lt;h2 id=&quot;what-about-technical-skills&quot;&gt;What About Technical Skills?&lt;/h2&gt;

&lt;p&gt;We’ve spent nearly a thousand words discussing Senior Engineers without mentioning technical ability. Strong technical skills are important. We’ve avoided talking about them for two reasons:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;They’re assumed for a Senior Engineer&lt;/li&gt;
  &lt;li&gt;Software development is &lt;a href=&quot;https://www.onebigfluke.com/2013/11/programming-is-a-social-endeavor.html&quot;&gt;very much a social endeavor&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Senior Engineers aren’t solely focused on building the function, or the page, or the story. Those are table stakes. Senior Engineers take a longer view. The code is critical today, but technical ability, good teammates, and good teams are what let us continue to build excellent products. Excellent Senior Engineers worry about building those as much as they do any feature.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Approach and mindset are as important to what makes a Senior Engineer as technical ability. Junior engineers, I know you’re already watching and learning from Senior Engineers around you. I urge you to watch not only what they do, but how they do it.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Is Artificial Intelligence Worth the Hype?</title>
   <link href="http://www.rpherbig.com/2020/04/13/is-ai-worth-the-hype.html"/>
   <updated>2020-04-13T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2020/04/13/is-ai-worth-the-hype</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://www.sep.com/sep-blog/2020/04/13/is-ai-worth-the-hype/&quot; /&gt;

&lt;p&gt;&lt;img src=&quot;/images/Gartner_Hype_Cycle.svg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image courtesy of Jeremykemp at &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Gartner_Hype_Cycle.svg&quot;&gt;English Wikipedia&lt;/a&gt; / &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/3.0&quot;&gt;CC BY-SA&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href=&quot;https://www.sep.com/sep-blog/2019/10/10/accidentalai/&quot;&gt;Everyday AI Problems&lt;/a&gt;, my colleague &lt;a href=&quot;https://www.sep.com/sep-blog/author/jordan-thayer&quot;&gt;Jordan Thayer&lt;/a&gt; said the following:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When someone asks me “What can AI do for me?”, I often suspect the answer is
“Not much” because it’s the wrong question. If someone asks me “Is there a way
to make this free text machinable?” or “Are there better techniques for
scheduling these work orders?” the answers are “Yes!” and “Almost certainly.”
Are the techniques that solve those problems AI? Absolutely.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Is AI worth the hype? Absolutely. Jordan believes this so strongly that he
pursued a doctorate in it and dedicated his entire professional career to it.
I’m a bit late to the party, but I agree with him and am trying to make up for
lost time! That said, AI isn’t a panacea; just because something is worthy of
the hype doesn’t mean that individual deployments can’t fail because they’re a
misapplication or just a bad idea overall. In the following, let’s discuss:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;What is AI?&lt;/li&gt;
  &lt;li&gt;When should you use it?&lt;/li&gt;
  &lt;li&gt;When shouldn’t you use it?&lt;/li&gt;
  &lt;li&gt;So what hype &lt;em&gt;is&lt;/em&gt; justifiable?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-is-ai&quot;&gt;What is AI?&lt;/h2&gt;

&lt;p&gt;Artificial Intelligence is getting a computer to do anything that would otherwise
require a human. &lt;a href=&quot;https://www.sep.com/sep-blog/2019/10/10/accidentalai/&quot;&gt;Common applications&lt;/a&gt; include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Machine_learning&quot;&gt;Machine learning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Planning and scheduling&lt;/li&gt;
  &lt;li&gt;Game playing&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Machine_vision&quot;&gt;Machine vision&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.sep.com/sep-blog/2019/11/29/several-examples-of-nlp/&quot;&gt;Natural language processing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While the machines are trying to imitate human capabilities, the way they do
that is often quite alien. Consider asking an AI and a person each to tell you
whether or not a tweet expressed a positive or negative sentiment about a
topic. The person would read the tweet, understand its meaning, and give you
an answer.&lt;/p&gt;

&lt;p&gt;In stark contrast, many AI approaches to sentiment analysis won’t even try to
understand the text as a whole. Instead, they look at the distribution of
words in the tweet, the length of those words, and the amount of punctuation
used. This statistical analysis allows the AI to reliably predict the
sentiment of the text without needing to produce a deeper understanding.&lt;/p&gt;

&lt;p&gt;It’s important to keep the difference in approach in mind. While AI can do
things that we typically think of as requiring a human touch, they do so by
different means. Our tendency to anthropomorphize things works against our
intuition here. An application of AI doesn’t think in the conventional sense.
Its outputs are the result of common processes in mathematics, computer
science, and engineering being rigorously applied to some problem of interest.&lt;/p&gt;

&lt;h2 id=&quot;when-is-ai-appropriate&quot;&gt;When is AI Appropriate?&lt;/h2&gt;

&lt;p&gt;AI comes up in situations you might not think of, or in ways differently than
you might imagine. For example, AI happens a lot in industrial settings from a
controls perspective: to solve a large constraint problem to ensure that we
don’t put an oil refinery in a dangerous configuration. &lt;a href=&quot;https://www.technologyreview.com/s/608811/drones-and-robots-are-taking-over-industrial-inspection/&quot;&gt;This drone
application&lt;/a&gt;
complements it: use drones to view hard-to-reach elements of an industrial
facility to reduce the cost of manual inspection.&lt;/p&gt;

&lt;p&gt;If your project fits within these guidelines, it’s a good candidate for AI:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;It can be thought of as requiring a human.&lt;/li&gt;
  &lt;li&gt;You can describe it through a rigorous or formal process.&lt;/li&gt;
  &lt;li&gt;It has a solution that is right/wrong or good/bad.&lt;/li&gt;
  &lt;li&gt;The human cost of completing it is significant.&lt;/li&gt;
  &lt;li&gt;The machine cost of completing it is less than the human cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some &lt;a href=&quot;https://www.sep.com/sep-blog/2019/10/10/accidentalai/&quot;&gt;problems that you encounter every
day&lt;/a&gt; fit those
criteria, and are often solved using artificial intelligence:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Scheduling constrained resources (classes in classrooms, meetings in meeting rooms, participant availability)&lt;/li&gt;
  &lt;li&gt;Planning sequences of actions&lt;/li&gt;
  &lt;li&gt;Predicting the next element in a series based on the previous elements&lt;/li&gt;
  &lt;li&gt;Identifying elements in a picture&lt;/li&gt;
  &lt;li&gt;Building a summary of a large body of text&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;when-is-ai-not-the-right-answer&quot;&gt;When is AI not the right answer?&lt;/h2&gt;

&lt;p&gt;AI is not the right tool for every task. It is important to remember that
artificial intelligence will not replace human intelligence.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Does your task require a process to be adaptable to unforeseen circumstances? If you cannot predict the workflow for the task, and it takes a human to make nuanced decisions, the task is not suitable for AI.&lt;/li&gt;
  &lt;li&gt;Is the human cost negligible or &lt;a href=&quot;https://www.technologyreview.com/s/614700/the-computing-power-needed-to-train-ai-is-now-rising-seven-times-faster-than-ever-before/&quot;&gt;the compute cost prohibitive&lt;/a&gt;? If AI will not save your company at the bottom line, then it is not worth your time developing the AI.&lt;/li&gt;
  &lt;li&gt;Can you define your task formally? AI follows strict rules — do or do not; it cannot make decisions, create on the spot, or think out of the box. If you cannot provide those rules to make your program work, it’s not a good candidate for AI.&lt;/li&gt;
  &lt;li&gt;Do societal norms prohibit automation? In some cases, an AI can completely replace a job previously done by a human. There is a &lt;a href=&quot;https://www.genesys.com/podcast/series/take-a-moment/ai-ethics-an-inside-look-at-the-future-of-artificial-intelligence&quot;&gt;great fear that automation will make humans obsolete&lt;/a&gt;. How does society ensure those people can continue to provide for their families? If we find that an AI can completely drive a car, will the passengers trust it? How does insurance and fault work in the event of a crash?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;justifying-the-hype&quot;&gt;Justifying the Hype&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/AI_winter&quot;&gt;This reality&lt;/a&gt; means that we may
never see &lt;a href=&quot;https://en.wikipedia.org/wiki/Robby_the_Robot&quot;&gt;Robby the Robot&lt;/a&gt; or R2-D2 or Data. They are relegated to the realm
of science fiction with flying cars. AI is often silently in the background,
playing a large role in many industries that directly impact our everyday
lives. Here are some absolutely game-changing examples:&lt;/p&gt;

&lt;h3 id=&quot;greenhouse-logistics&quot;&gt;Greenhouse Logistics&lt;/h3&gt;

&lt;p&gt;Cultivating crops with higher yields that are more resilient to the elements
and pests is a problem whose solution affects all of us - after all, everyone
needs to eat! Here, AI is being used to reduce the human effort required for
phenotyping.&lt;/p&gt;

&lt;p&gt;Phenotyping is the study of plant characteristics, like the size of the fruits
they produce, under various conditions. Large-scale phenotyping used to be
time and labor intensive - a human made the observations by hand. Scientists
developed machine vision algorithms to do it for us.&lt;/p&gt;

&lt;p&gt;Further, the AI planning community has been using &lt;a href=&quot;https://www.bosch.com/stories/greenhouse-guardian-ai-in-agriculture/&quot;&gt;automation of smart
greenhouses&lt;/a&gt;
as a benchmark domain for a decade. The logistics problems that ‘crop up’ here
are moving plants (or equipment) to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Control the amount of light, water, and nutrients each plant gets&lt;/li&gt;
  &lt;li&gt;Pass the plant beneath a variety of sensors&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;medicine&quot;&gt;Medicine&lt;/h3&gt;

&lt;p&gt;Medicine has advanced dramatically in the last century thanks in no small part
to advances in medical imaging. Medical imaging provides information that is
critical to determining what is going on with an individual so that the proper
course of action can be determined.&lt;/p&gt;

&lt;p&gt;Medical imaging is an excellent domain for deploying machine vision
algorithms. In particular, deep learning has been &lt;a href=&quot;https://www.radiologytoday.net/archive/rt0118p10.shtml&quot;&gt;remarkably
successful&lt;/a&gt; in
reducing the time between a first consultation and a diagnosis and increases
the number of patients that can be treated by each doctor. This is also a
great example of how AI works best with human collaboration.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;It’s easy to get excited about AI. There is so much progress made in so many
fields which all show the promise of AI. Although we must be realistic about
the scope of AI, we can still get excited about its prospects.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.aninews.in/news/business/businesses-gaining-value-from-artificial-intelligence-experimentation-mindtree-study20190912114211/&quot;&gt;We must be unafraid to
fail&lt;/a&gt;.
In the end, all AI deployments are an experiment, because we can’t know
upfront how well a technique will work for a set of problems that we’ve never
seen before. Failing, understanding, and iterating is a huge part of
developing AI solutions.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Cloud-based Machine Learning Offerings - Beginner's Perspective</title>
   <link href="http://www.rpherbig.com/2020/03/26/Cloud-based-Machine-Learning-Offerings-Beginner-Perspective.html"/>
   <updated>2020-03-26T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2020/03/26/Cloud-based-Machine-Learning-Offerings-Beginner-Perspective</id>
   <content type="html">&lt;h2 id=&quot;links&quot;&gt;Links&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Indy Cloud Conf 2020: &lt;a href=&quot;https://www.youtube.com/watch?v=4kGST2BC25A&quot;&gt;Recording&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;If you’re convinced that machine learning is worth learning about, but don’t know where to start, this talk is for you. If you’ve never seen machine learning applied to solving a concrete problem but would like to, this talk is for you.&lt;/p&gt;

&lt;p&gt;We’ll explore cloud-based machine learning offerings from the three largest providers: Amazon (SageMaker), Microsoft (Azure ML), and Google (AI Platform). We’ll investigate these offerings with open datasets for digit recognition and breast cancer identification.&lt;/p&gt;

&lt;p&gt;Our evaluation will focus on the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ease of loading data&lt;/li&gt;
  &lt;li&gt;Quality of tools for data preparation and cleaning&lt;/li&gt;
  &lt;li&gt;Availability of machine learning algorithms&lt;/li&gt;
  &lt;li&gt;Ease of comparing machine learning algorithms on a task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This talk will leave you with a better sense of the trade-offs between the cloud-based machine learning offerings. This will help you select the right offering to solve your problems with machine learning.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Conference Talk Roadmap</title>
   <link href="http://www.rpherbig.com/2019/12/02/conference-talk-roadmap.html"/>
   <updated>2019-12-02T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2019/12/02/conference-talk-roadmap</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://www.sep.com/sep-blog/2019/12/01/conference-talk-roadmap/&quot; /&gt;

&lt;p&gt;&lt;img src=&quot;/images/speaking_opportunity.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Co-authored by &lt;a href=&quot;https://jordanthayer.com/&quot;&gt;Jordan Thayer&lt;/a&gt; and &lt;a href=&quot;https://www.rpherbig.com/&quot;&gt;Robert Herbig&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.inc.com/carmine-gallo/public-speaking-is-no-longer-a-soft-skill-its-your-key-to-success-in-any-field.html&quot;&gt;Presenting information to your peers is an important part of an any career&lt;/a&gt;, especially engineering:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Teaching a subject reinforces your own understanding and mastery&lt;/li&gt;
  &lt;li&gt;Presentation and communication skills are essential to team based work&lt;/li&gt;
  &lt;li&gt;Sharing knowledge helps improve the teams you’re working on&lt;/li&gt;
  &lt;li&gt;It helps bring in new business (which keeps us all employed!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maybe you don’t feel like you have anything interesting to say. You do. Any
idea is valuable to share given the right audience. We’ll present some ways to
develop your ideas and find an appropriate venue.&lt;/p&gt;

&lt;p&gt;Maybe you don’t feel like you have time to prepare a talk. Giving a good talk
does take time, however the time doesn’t need to be spent all at once. You can
build a presentation in installments over the course of weeks or months. Most
companies have activities that support this piecemeal construction of
presentation material.&lt;/p&gt;

&lt;h1 id=&quot;the-roadmap&quot;&gt;The Roadmap&lt;/h1&gt;

&lt;p&gt;We, the authors, think of a conference talk as the capstone to a larger process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Have an idea&lt;/li&gt;
  &lt;li&gt;Record an idea&lt;/li&gt;
  &lt;li&gt;Expand an idea into a lightning talk&lt;/li&gt;
  &lt;li&gt;Expand the lightning talk into a blog post&lt;/li&gt;
  &lt;li&gt;Expand the blog post into a long talk&lt;/li&gt;
  &lt;li&gt;Give the talk internally (e.g. brown bag or lunch and learn)&lt;/li&gt;
  &lt;li&gt;Give the talk externally (e.g. meetup or conference)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every step of the process is worthwhile. At every step, you have produced
something of value. This process is meant to be interruptible and resumable.
It starts with having something worth talking about (which everyone does!).&lt;/p&gt;

&lt;h2 id=&quot;have-your-thought&quot;&gt;Have Your Thought&lt;/h2&gt;

&lt;p&gt;Start with an idea. You are the expert on this idea. You don’t have to be an
expert on &lt;em&gt;everything&lt;/em&gt; about the topic, just &lt;em&gt;your&lt;/em&gt; experience with it. That
experience is yours alone and no one else’s.&lt;/p&gt;

&lt;p&gt;If you feel like you don’t have an idea, here are some prompts that might help you elicit yours:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;What are you doing that you haven’t seen a team do before?&lt;/li&gt;
  &lt;li&gt;What are you doing that you think others would be excited to learn about?&lt;/li&gt;
  &lt;li&gt;What is your team doing that may surprise or interest other teams, or what are you doing on this team that you haven’t done on any others you’ve been on?&lt;/li&gt;
  &lt;li&gt;What of those things do you think you should share with other teams?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;collect-your-thoughts&quot;&gt;Collect Your Thoughts&lt;/h2&gt;

&lt;p&gt;The key to building a talk over weeks or months is to be able to put it down and
then later pick up where you left off. Otherwise spreading effort out will just end
up being wasting effort, as you struggle to find your place from when you last
left off.&lt;/p&gt;

&lt;p&gt;There are lots of things that you could put in your repository. We’ve found
the following organizational structure helpful:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A document that captures a collection of ideas&lt;/li&gt;
  &lt;li&gt;A set of personas to help us target and refine our presentations&lt;/li&gt;
  &lt;li&gt;A directory for pitches, organized by topic&lt;/li&gt;
  &lt;li&gt;A directory for short presentations (e.g. lightning talks)&lt;/li&gt;
  &lt;li&gt;A directory for blog entries&lt;/li&gt;
  &lt;li&gt;A directory for long talks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two elements are what we use when we’re deciding what we should start
next. We pick a topic that we feel is particularly important and an audience
that we’re especially interested in reaching today. Then we start in on the
writing.&lt;/p&gt;

&lt;h2 id=&quot;giving-a-lightning-talk&quot;&gt;Giving A Lightning Talk&lt;/h2&gt;

&lt;p&gt;Often, a topic and a few related thoughts are enough to give a &lt;a href=&quot;https://en.wikipedia.org/wiki/Lightning_talk&quot;&gt;lightning
talk&lt;/a&gt;. Ten minutes may sound
like a lot before you get in front of a group, but it’s shockingly short once
you’re speaking to something you’re interested in. If you spend three minutes
explaining the problem, three minutes explaining your approach to it, and
three minutes describing why that was better than what you used to do, you’ve
got just one minute left over.&lt;/p&gt;

&lt;p&gt;That leftover minute is for audience interaction. It’s important to pay
attention to how the audience reacts and what questions they ask. This gives
you important guidance for your blog post.&lt;/p&gt;

&lt;h2 id=&quot;expanding-the-talk-into-a-post&quot;&gt;Expanding the Talk into a Post&lt;/h2&gt;

&lt;p&gt;If ten minutes is short, three minutes should be positively claustrophobic.
It is critical to stay on point, focusing pretty much only on the central point
of each part of the lightning talk. This focus is good for the lightning talk,
but it also serves to produce an outline for the blog post. You’ve already
done the hard work of distilling your thoughts down to a small number of the
most important, salient points. That’s where you start writing from; that’s
your outline.&lt;/p&gt;

&lt;p&gt;The next step is to supplement those points with supporting facts to flesh out the blog
post. Be sure to address any questions that came up during the lightning talk
and expand upon any areas that the audience was particularly interested in.
Make sure that your supporting facts do not distract from the central topic. A
quick check is: if this was left out, would the reader still come to the
conclusion we want them to?&lt;/p&gt;

&lt;p&gt;It’s important not to stall out here. &lt;a href=&quot;https://en.wikipedia.org/wiki/Perfect_is_the_enemy_of_good&quot;&gt;Don’t wait until the blog post is
perfect, just wait until it’s
complete&lt;/a&gt;. You
want feedback on your writing. The best feedback is going to come from people
who are already immersed in the topic. For example, the people that attended
your lightning talk. If you get that post out there while the talk is still
fresh in their mind, you’re going to get more pointed feedback from your
readers. The more direct and specific the feedback, the easier it is to take
action based on it.&lt;/p&gt;

&lt;h2 id=&quot;give-a-brown-bag&quot;&gt;Give a Brown Bag&lt;/h2&gt;

&lt;p&gt;Our brown bags are thirty minute talks given to our colleagues within the
company. Thirty minutes may sound like a lot of time to speak. It is, and it
isn’t. In thirty minutes, you can get into detail on a topic everyone already
knows about. Or, you can cover some of the most important points of a topic
that most people aren’t familiar with. The thing is, you’re not going to make
anyone an expert on a subject in half an hour. At best, you can tell a story
and convince them that they should invest more time in getting a better
understanding.&lt;/p&gt;

&lt;p&gt;The lightning talk or blog post can serve as a starting point for the brown bag.
Previously we recommended splitting the talk into thirds: what is the problem,
how do you solve it, how is that an improvement. That’s still a viable approach,
but you may find the following breakdowns attractive as well:&lt;/p&gt;

&lt;p&gt;Template 1&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;What is the problem?
    &lt;ul&gt;
      &lt;li&gt;Who has the problem?&lt;/li&gt;
      &lt;li&gt;What’s the cost of not addressing the problem?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;How do we solve it?
    &lt;ul&gt;
      &lt;li&gt;What are the techniques for solving it?&lt;/li&gt;
      &lt;li&gt;What are the trade-offs?&lt;/li&gt;
      &lt;li&gt;What have we used to date?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Template 2&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;What is the problem?
    &lt;ul&gt;
      &lt;li&gt;What lead to the problem?&lt;/li&gt;
      &lt;li&gt;Who typically follows this trajectory?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;How do you solve the problem?
    &lt;ul&gt;
      &lt;li&gt;When can you intervene?&lt;/li&gt;
      &lt;li&gt;What interventions are appropriate when?&lt;/li&gt;
      &lt;li&gt;When is it too early to solve? When is it too late?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;How can you recognize these problems?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Template 3&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;What is the technique?
    &lt;ul&gt;
      &lt;li&gt;What is it’s history?&lt;/li&gt;
      &lt;li&gt;What are common misinterpretations of it?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Where can it be applied?
    &lt;ul&gt;
      &lt;li&gt;What are some successful case studies?&lt;/li&gt;
      &lt;li&gt;What are some failed examples?&lt;/li&gt;
      &lt;li&gt;What’s the most common misapplication?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;How do we apply it?&lt;/li&gt;
  &lt;li&gt;Where can we learn more?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if none of the above templates are a good fit for your talk, notice that all
of the above are phrased in the form of questions. We find it helpful to think
about a talk, from start to finish, in terms of what we want the audience to
come away with. The templates above are motivated by thinking about which
questions we’d like the audience to be able to answer about a topic after
listening to our talk.&lt;/p&gt;

&lt;p&gt;Once you’ve figured out what you want the audience to take away and, roughly,
what you’d like to present, it’s time to fill out the rough draft. The lightning
talk and the blog post should go a long way towards filling in the material for
your presentation; you should be able to reuse some of the slides from the
lightning talk, and if you made any visualizations or included any pictures in
your blog post, those are good candidates for inclusion in the brown bag.&lt;/p&gt;

&lt;p&gt;We suggest that you never give the first rendition of your talk to a live
audience, even an incredibly friendly audience like the kind we have in house.
Instead, give the first version of your talk to an empty room. There are three
reasons for this:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Estimating the duration of a slide is hard&lt;/li&gt;
  &lt;li&gt;Your script will refine itself with each pass&lt;/li&gt;
  &lt;li&gt;Some issues are only obvious when speaking to a slide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your talk will improve with repeated presentations. Get the rockiest
presentation out of the way before you’re in front of a group. This lets you
get better feedback when you do the next dry run in front of an audience of one or two
others. This serves two purposes: it provides outside perspective on
what isn’t obvious to a non-expert, and it gives you feedback on the quality
of the presentation overall.&lt;/p&gt;

&lt;h2 id=&quot;find-an-appropriate-external-venue&quot;&gt;Find an appropriate external venue&lt;/h2&gt;

&lt;p&gt;Don’t let your talk be done after you present to your colleagues. You want to
share those ideas to the rest of your peers within the software development
community.&lt;/p&gt;

&lt;p&gt;The first step to giving an external talk (e.g. at a meetup or a conference)
is finding a venue. There are a variety of &lt;a href=&quot;https://aaai.org/ocs/&quot;&gt;mailing lists&lt;/a&gt;, &lt;a href=&quot;https://dl.acm.org/events.cfm&quot;&gt;aggregators&lt;/a&gt;, and
&lt;a href=&quot;https://www.meetup.com/&quot;&gt;services&lt;/a&gt; that can point you in the right direction. The tricky part is finding
the right venue. Here are the things we consider:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Is this the right audience?
    &lt;ul&gt;
      &lt;li&gt;Are audience members interested in my talk?&lt;/li&gt;
      &lt;li&gt;Am I interested in being known by the audience members?&lt;/li&gt;
      &lt;li&gt;Do I want to be associated with the other presenters?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;How expensive is it to present here? (your company may cover some of the cost)
    &lt;ul&gt;
      &lt;li&gt;Travel&lt;/li&gt;
      &lt;li&gt;Registration fees&lt;/li&gt;
      &lt;li&gt;Time away from the office&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;How prestigious is the venue?
    &lt;ul&gt;
      &lt;li&gt;Who else presents or has presented here?&lt;/li&gt;
      &lt;li&gt;Is this the first year? The tenth?&lt;/li&gt;
      &lt;li&gt;Who are the major sponsors?&lt;/li&gt;
      &lt;li&gt;City-level, Regional, International?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most conferences will ask for a pitch to evaluate whether or not a talk is
appropriate for inclusion in their proceedings. If you’ve been following along
with the roadmap, you’ve got a number of sources to help you build the pitch:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The lightning talk&lt;/li&gt;
  &lt;li&gt;The introduction of your blog post&lt;/li&gt;
  &lt;li&gt;The outline for your brown bag&lt;/li&gt;
  &lt;li&gt;The introduction of your brown bag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From these, it should be easy to gather the central points of your talk, a
description of who the target audience is, and what you expect that audience to
gain from the talk. Those are the core components of a solid pitch.&lt;/p&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;Public speaking engagements are an important part of any career, yes, even
yours. They help us hone our communication skills, reinforce our own knowledge
on a subject, and improve the community that we work in. Although every
presentation you give is the result of substantial investment, you do not
need to spend all of the time at once. Spreading out the work reduces how much it
impacts other obligations, like project work. Further, it provides more time
for feedback and refinement which results in a better presentation overall.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Facilitation: Don't Lose Before You Start</title>
   <link href="http://www.rpherbig.com/2019/10/25/facilitation-dont-lose-before-you-start.html"/>
   <updated>2019-10-25T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2019/10/25/facilitation-dont-lose-before-you-start</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://www.sep.com/sep-blog/2019/10/25/facilitation-dont-lose-before-you-start/&quot; /&gt;

&lt;p&gt;&lt;img src=&quot;/images/facilitation_activity.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So you want to facilitate a workshop for a team? Maybe you’re external to the team and have been asked to help by facilitating. Awesome, it’ll be fun. Just show up at the time and place annnnnnnd you’ve already lost.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;You better think (think)&lt;/p&gt;

  &lt;p&gt;Think about what you’re trying to do&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://en.wikipedia.org/wiki/Aretha_Franklin&quot;&gt;Aretha Franklin&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;ask-the-right-question&quot;&gt;Ask The Right Question&lt;/h2&gt;

&lt;p&gt;The workshop should be answering a question. That gives all of the participants a clear vision of what they’re trying to achieve. “What is preventing the team from moving faster?” is a very different workshop than “How do we improve our deployment process?” which is very different from “How do we fully automate our deployment process?”&lt;/p&gt;

&lt;p&gt;Getting everyone aligned on outcomes is key to success.&lt;/p&gt;

&lt;h2 id=&quot;get-to-know-your-stakeholders&quot;&gt;Get to Know Your Stakeholders&lt;/h2&gt;

&lt;p&gt;If one person felt strongly enough about this to block off time on the team’s calendar, they are the First Stakeholder. Start with them. You need to understand what they want out of this workshop. What outcomes will make them call this a success? Help them understand their role in the workshop: getting the right people in the room, taking a step back, and letting the team be awesome. If there is no such person, that’s fine too.&lt;/p&gt;

&lt;p&gt;Hopefully the First Stakeholder has conveyed their vision of success to the team. Validate that assumption. Talk to the rest of the team. Understand what they want to get out of the workshop. It’s better to discover any differences ahead of time rather than in the workshop itself.&lt;/p&gt;

&lt;p&gt;Use these conversations with the team members to learn their perspectives, their pains, their goals for the workshop. Is it scheduled at the same time as their kid’s play at school but they’re forced to attend? That’s good to know. Find out who on the team is quiet, who interrupts, who isn’t afraid to speak their mind. Find out who on the team likes the status quo and &lt;a href=&quot;https://hbr.org/2013/07/hidden-danger-of-being-risk-averse&quot;&gt;doesn’t feel change is necessary&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If what you’re learning isn’t making sense, or there are incompatible goals, if some constraints can’t possibly be met, etc. then have a second sit-down with the First Stakeholder or with the team as a whole. Help them understand what you’ve learned. The workshop simply won’t be successful as framed - the direction needs to change. Be supportive and advocate for the team and the individuals you’ve talked to.&lt;/p&gt;

&lt;h2 id=&quot;learn-the-teams-communication-style&quot;&gt;Learn the Team’s Communication Style&lt;/h2&gt;

&lt;p&gt;Ask if the team has established any norms (especially around communication styles) or shared vocabulary. You as facilitator need to be aware of these and use them in the workshop. If they don’t, be prepared to suggest some at the workshop. A good baseline could include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.simplypsychology.org/fundamental-attribution.html&quot;&gt;Assume the best in each other&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.belbin.com/resources/blogs/belbin-and-project-aristotle-everything-you-need-to-know/&quot;&gt;Don’t interrupt the person talking&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://rework.withgoogle.com/print/guides/5721312655835136/&quot;&gt;Everyone’s contributions are valuable&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.americanpressinstitute.org/need-to-know/offbeat/scientific-reason-first-idea-rarely-best-one/&quot;&gt;The first idea is rarely the best idea&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.tablegroup.com/books/dysfunctions&quot;&gt;Promote &lt;em&gt;healthy&lt;/em&gt; conflict&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, just because the team &lt;em&gt;says&lt;/em&gt; they have some established or agreed-upon norms doesn’t mean they’ll be executed perfectly. The usual facilitator responsibility still applies. Having talked about it, though, helps hold the team accountable to what they said.&lt;/p&gt;

&lt;h2 id=&quot;pick-the-right-time-of-day&quot;&gt;Pick the Right Time of Day&lt;/h2&gt;

&lt;p&gt;It matters. If you have a team of night-owls, don’t expect a lot of dazzling creativity at 8am. If the team gets into the office before 8am, don’t plan the meeting for the late afternoon. If the workshop is early, provide breakfast. If it’s around lunchtime, provide lunch.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.danpink.com/&quot;&gt;Daniel Pink&lt;/a&gt; wrote &lt;a href=&quot;https://www.amazon.com/When-Scientific-Secrets-Perfect-Timing/dp/0735210624&quot;&gt;a book called “When”&lt;/a&gt; which goes into more depth on the topic of &lt;em&gt;chronobiology&lt;/em&gt;. If you can, plan activities to occur at the appropriate time of day to correspond with type of thinking involved. &lt;a href=&quot;https://news.stlpublicradio.org/post/take-more-breaks-4-other-facts-about-author-daniel-pinks-scientific-secrets-perfect-timing&quot;&gt;Here’s a quick summary&lt;/a&gt; if you want to learn more.&lt;/p&gt;

&lt;p&gt;Of course, sometimes the time is out of our control. Don’t sweat what you don’t control, just move on and make the best of it.&lt;/p&gt;

&lt;h2 id=&quot;planning-the-workshop-activities&quot;&gt;Planning the Workshop Activities&lt;/h2&gt;

&lt;h3 id=&quot;kick-it-off&quot;&gt;Kick It Off&lt;/h3&gt;

&lt;p&gt;The first part of any workshop should be to remind the team &lt;strong&gt;why&lt;/strong&gt; they’re here. The goal of the kick off is to inspire the group. Consider having the First Stakeholder do this part. They must provide a vision of success. This sets the tone for the rest of the workshop and is foundational. It’s also a good time to talk about team norms around communication. Suggest some basic ones if needed. Use that as the foundation to set expectations with the team.&lt;/p&gt;

&lt;h3 id=&quot;pick-the-right-activities&quot;&gt;Pick the Right Activities&lt;/h3&gt;

&lt;p&gt;If I tried to talk about specific activities, this article would turn into a book. Luckily for us, Esther Derby and Diana Larsen already wrote the book: &lt;a href=&quot;https://www.amazon.com/Agile-Retrospectives-Making-Teams-Great/dp/0977616649&quot;&gt;Agile Retrospectives: Making Good Teams Great&lt;/a&gt;. Think of it as a cookbook with recipes for activities. The activities are broadly broken up into three categories: gathering data, generating insights, and deciding what to do. There’s a description of each activity and a quick note about what the team should expect to get out of it.&lt;/p&gt;

&lt;p&gt;Every activity should get the team closer one step closer to accomplishing its goal.&lt;/p&gt;

&lt;h3 id=&quot;vary-up-the-type-of-activities&quot;&gt;Vary Up the Type of Activities&lt;/h3&gt;

&lt;p&gt;There are three types of activities in most workshops:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Emotional or Creative - creative work like brainstorming or how does something make you feel? Example: “What pains have you felt when using the system?” or “What would the ideal system look like?”&lt;/li&gt;
  &lt;li&gt;Mechanical or Administrative - the most straightforward. Example: “Draw a diagram of the system as it is today.”&lt;/li&gt;
  &lt;li&gt;Intellectual or Analytical - sometimes requires focused attention. Problem solving. Example: “What steps do we need to take to mitigate the problems in the system?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In general, I would start the workshop with an emotional activity. Bonding or trust building helps to get people comfortable speaking with each other. On the other hand, if the team needs to wake up (say, they’re night owls at a morning workshop), I suggest starting with a mechanical activity to warm up.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The majority of presentations are purely analytical. They offer information but no human connection. The goal is to mix analytical content with emotional content, which creates contrast and therefore creates interest.&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://www.duarte.com/persuasive-presentations-dont-be-boring-your-presentations-missing-secret-ingredient-part-2/&quot;&gt;Nancy Duarte&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She is talking about presentations, but her advice applies here too: vary up the types of activities to keep people interested.&lt;/p&gt;

&lt;h3 id=&quot;know-your-audience&quot;&gt;Know Your Audience&lt;/h3&gt;

&lt;p&gt;As the facilitator, your audience is the team you’ll be working with in the workshop. Use what you learned from talking to people before the workshop to shape your approach and the activities.&lt;/p&gt;

&lt;p&gt;For example, if there are team members who are naturally quiet or aren’t comfortable speaking up, most activities can be adjusted to help them out. A typical brainstorming activity could start with 5 minutes of silent brainstorming. That same change would help out team members who aren’t comfortable thinking out loud or extemporaneously.&lt;/p&gt;

&lt;h3 id=&quot;mitigate-common-stressors&quot;&gt;Mitigate Common Stressors&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;We find that the percentage of favorable rulings drops gradually from ≈65% to nearly zero within each decision session and returns abruptly to ≈65% after a break. Our findings suggest that judicial rulings can be swayed by extraneous variables that should have no bearing on legal decisions.&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://www.pnas.org/content/108/17/6889.short&quot;&gt;Extraneous factors in judicial decisions&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don’t let easily controllable &lt;em&gt;extraneous factors&lt;/em&gt; cause distraction or reduce the effectiveness of the team. If they fail, it should be on their own lack of merit (I kid, I kid!). If the workshop intrudes on a mealtime, provide food. Regardless, provide snacks and drinks. Being &lt;a href=&quot;https://www.merriam-webster.com/dictionary/hangry&quot;&gt;hangry&lt;/a&gt; is a real thing!&lt;/p&gt;

&lt;p&gt;Likewise, plan to take breaks about every hour. Each activity should either be done within an hour or be able to be paused for a few minutes at the one hour mark. Read the room and go longer or shorter as appropriate.&lt;/p&gt;

&lt;h3 id=&quot;pace-yourself&quot;&gt;Pace Yourself&lt;/h3&gt;

&lt;p&gt;Estimate time for each activity (range, not single point). Know what you want to do if the workshop is running fast, or what can be cut or shortened if the workshop is going slow.&lt;/p&gt;

&lt;h2 id=&quot;end-with-action-items&quot;&gt;End With Action Items&lt;/h2&gt;

&lt;p&gt;Set the team up to succeed:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Recap where you ended up with the original goals. Were they all met? What remains undiscussed?&lt;/li&gt;
  &lt;li&gt;End with concrete action items.&lt;/li&gt;
  &lt;li&gt;Action items should have deadlines or target dates when possible.&lt;/li&gt;
  &lt;li&gt;Each action item should be assigned to one person. If everyone is responsible for an item, &lt;a href=&quot;https://en.wikipedia.org/wiki/Diffusion_of_responsibility&quot;&gt;no one is responsible for it&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;after-the-workshop&quot;&gt;After the Workshop&lt;/h2&gt;

&lt;p&gt;How involved you are in the ‘after’ phase varies. In my experience, the best results come from the team committing and the facilitator offering to be available for advice, suggestions, and help. &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Chicken_and_the_Pig&quot;&gt;You’re the chicken, not the pig&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h2&gt;

&lt;p&gt;You know your context better than I do. To butcher something said by the famous George Orwell, &lt;a href=&quot;https://en.wikipedia.org/wiki/Politics_and_the_English_Language#Remedy_of_Six_Rules&quot;&gt;break any of these rules before doing something that doesn’t make sense&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You should still consider everything I mentioned here. Be deliberate. That doesn’t mean you need to invest time trying to account for every possible outcome - be agile and lean and pragmatic. Spend more or less time preparing based on the importance of the meeting and the expected return of that prep time.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Plans are worthless, but planning is everything.&lt;/p&gt;

  &lt;p&gt;– &lt;a href=&quot;https://quoteinvestigator.com/2017/11/18/planning/&quot;&gt;Dwight D. Eisenhower&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Improvise, adapt, and overcome.&lt;/p&gt;

&lt;p&gt;It’s going to be fun.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Making AI More Accessible to the Non-Developer</title>
   <link href="http://www.rpherbig.com/2019/10/11/Making-AI-More-Accessible-to-the-Non-Developer.html"/>
   <updated>2019-10-11T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2019/10/11/Making-AI-More-Accessible-to-the-Non-Developer</id>
   <content type="html">&lt;h2 id=&quot;given-at&quot;&gt;Given at&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;PyData Indy 2019: &lt;a href=&quot;https://www.youtube.com/watch?v=MFjsPVlbEDM&quot;&gt;Recording&lt;/a&gt;, &lt;a href=&quot;https://www.dropbox.com/scl/fi/luo3fxyhlenq7kkxd3btw/AccessibleML-IndyPyBytes2019.pdf?rlkey=yfj50hqumf7o708boo7b3r0hs&amp;amp;st=dt4els2a&amp;amp;dl=0&quot;&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Many of our clients have domain experts who are identifying interesting properties in large sets of data. The experts are often systems or mechanical or electrical engineers who are not statisticians, data scientists, or programmers. Rather than hire one of those and teach them the domain, these clients want their existing experts to leverage AI techniques to better perform the tasks they are already doing.&lt;/p&gt;

&lt;p&gt;There are many AI libraries available in Python, but they are designed to be used by programmers. We have been building some tools in Python to lower the barrier to entry for those existing libraries. We detect common errors early, make evaluation of learner performance easy, and visualization of learner behavior and the underlying data more accessible.&lt;/p&gt;

&lt;p&gt;We’ll talk about what drove these decisions and walk through a simple example of using this tool on a readily-available dataset.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Cybersecurity in the Modern Age</title>
   <link href="http://www.rpherbig.com/2018/04/17/cybersecurity-modern-age.html"/>
   <updated>2018-04-17T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2018/04/17/cybersecurity-modern-age</id>
   <content type="html">&lt;h2 id=&quot;given-at&quot;&gt;Given at&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Indy.Code() 2018&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;p&gt;Cybersecurity is a critical part of the software we develop. New risks and threats are emerging every day while the cost of a breach has never been greater. However, even if the software professionals understand this, communicating the risks and impact to the rest of the organization is difficult.&lt;/p&gt;

&lt;p&gt;Attendees will leave with a better understanding of the importance of cybersecurity, an overview of how threat modeling can be used to detect our own vulnerabilities before they’re exploited, and a framework for how to discuss cybersecurity with the larger organization.&lt;/p&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;
&lt;p&gt;security cybersecurity risk mitigation communication&lt;/p&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
&lt;p&gt;Anyone involved in the software development process, not just developers themselves, could benefit from learning about the state of cybersecurity and what we can do to make it better.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Speaking: Cybersecurity in the Age of IoT</title>
   <link href="http://www.rpherbig.com/2017/09/28/cybersecurity-age-of-iot.html"/>
   <updated>2017-09-28T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2017/09/28/cybersecurity-age-of-iot</id>
   <content type="html">&lt;h2 id=&quot;given-at&quot;&gt;Given at&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Prairie.Code() 2017&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;abstract&quot;&gt;Abstract&lt;/h2&gt;

&lt;h2 id=&quot;tags&quot;&gt;Tags&lt;/h2&gt;

&lt;h2 id=&quot;description-of-target-audience&quot;&gt;Description of target audience&lt;/h2&gt;
</content>
 </entry>
 
 <entry>
   <title>Security in the Age of the Internet of Things (abridged)</title>
   <link href="http://www.rpherbig.com/2017/06/02/security-in-iot-abridged.html"/>
   <updated>2017-06-02T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2017/06/02/security-in-iot-abridged</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;http://techpoint.org/2017/05/security-age-internet-things/&quot; /&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href=&quot;http://techpoint.org/2017/05/security-age-internet-things/&quot;&gt;TechPoint&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Internet of Things is &lt;a href=&quot;https://www.postscapes.com/internet-of-things-market-size/&quot;&gt;growing fast&lt;/a&gt;. Connecting so many devices leads to better decisions, safety, and efficiency. But with this comes new security challenges. We, as the defenders, are in a constant arms race against malicious actors. They can fail to attack a system one hundred times and be no worse off. But it only takes one mistake in our defense for them to win. We have seen these growing pains countless times before (and will again) as technology changes.&lt;/p&gt;

&lt;h2 id=&quot;what-makes-iot-security-different&quot;&gt;What makes IoT security different?&lt;/h2&gt;

&lt;p&gt;Now that the number of devices involved is so much larger, there is a larger impact if things go wrong. Why is that?&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Many of these devices are being made by companies without a strong background in security&lt;/li&gt;
  &lt;li&gt;Speed to market is a key metric in this emerging market&lt;/li&gt;
  &lt;li&gt;This encourages companies to do the bare minimum for security&lt;/li&gt;
  &lt;li&gt;Security is not a competitive advantage, so it often further deprioritized&lt;/li&gt;
  &lt;li&gt;Businesses often focus on the next version, leaving minimal support for released products&lt;/li&gt;
  &lt;li&gt;Deploying updates to already-released devices requires an investment in infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, security is rarely made a priority and given enough time or money.&lt;/p&gt;

&lt;h2 id=&quot;wont-the-market-self-correct&quot;&gt;Won’t the market self-correct?&lt;/h2&gt;

&lt;p&gt;Not with the current economic incentives: the cost of failure is externalized. Bruce Schneier &lt;a href=&quot;https://www.schneier.com/essays/archives/2016/10/we_need_to_save_the_.html&quot;&gt;has a great explanation&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Think of all the CCTV cameras and DVRs used in the &lt;a href=&quot;https://krebsonsecurity.com/2016/09/krebsonsecurity-hit-with-record-ddos/&quot;&gt;attack against Brian Krebs&lt;/a&gt;. The owners of those devices do not care. Their devices were cheap to buy, they still work, and they do not even know Brian. The sellers of those devices do not care: they are now selling newer and better models, and the original buyers only cared about price and features. Insecurity is what economists call an externality: it’s an effect of the purchasing decision that affects other people. Think of it kind of like invisible pollution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is similar to how credit card fraud primarily affects &lt;a href=&quot;https://www.troyhunt.com/relax-its-only-your-credit-card-near/&quot;&gt;merchants and banks&lt;/a&gt;, not the end user. In fact, some criminals find it more lucrative to keep their presence hidden and &lt;a href=&quot;https://krebsonsecurity.com/2011/04/is-your-computer-listed-for-rent/&quot;&gt;rent out the compromised device&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;why-should-consumers-care&quot;&gt;Why should consumers care?&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&quot;https://arstechnica.com/security/2017/04/rash-of-in-the-wild-attacks-permanently-destroys-poorly-secured-iot-devices/&quot;&gt;new type of malware&lt;/a&gt; is spreading that &lt;a href=&quot;https://www.bleepingcomputer.com/news/security/new-malware-intentionally-bricks-iot-devices/&quot;&gt;permanently disables&lt;/a&gt; any &lt;a href=&quot;https://www.theregister.co.uk/2017/04/08/brickerbot_malware_kills_iot_devices/&quot;&gt;vulnerable IoT devices&lt;/a&gt; it can find. If this trend continues, customers will now be directly impacted.&lt;/p&gt;

&lt;p&gt;Devices like the &lt;a href=&quot;https://twitter.com/amazonecho&quot;&gt;Amazon Echo&lt;/a&gt; (powered by Alexa) are becoming more and more popular. Alexa must listen to (but not necessarily record) &lt;em&gt;everything&lt;/em&gt; that it can hear. What is the risk profile of an Echo (or similar device) being compromised?&lt;/p&gt;

&lt;p&gt;Some IoT devices track health or fitness data (e.g. heart rate, temperature, footstep count, etc.) that can reveal a lot about you. How active you are and when can reveal when you are out of the house on your morning jog and your sleep patterns. Trends in this data can reveal if you are ill or have a chronic medical condition. Samsung’s new smart refrigerator can &lt;a href=&quot;http://newatlas.com/samsung-family-hub-smart-fridge/41192/&quot;&gt;report its contents&lt;/a&gt;, which could reveal if you are on vacation. The type of food you eat reveals information about your health. The cost of the food you eat can tell a picture of your finances. On the small scale, this is invaluable for targeting individuals. On a larger scale, this information can be used to build profiles of consumers, which is &lt;a href=&quot;http://www.nytimes.com/2012/02/19/magazine/shopping-habits.html&quot;&gt;nothing new&lt;/a&gt;, but now far more intrusive.&lt;/p&gt;

&lt;h2 id=&quot;why-should-businesses-care&quot;&gt;Why should businesses care?&lt;/h2&gt;

&lt;p&gt;Liability is murky in many of these cases (having not been tested in the courts), but there is a lot at stake. Take cars, for example. On the &lt;em&gt;relatively&lt;/em&gt; tame end of the vulnerability spectrum is being able to get access to &lt;a href=&quot;https://www.troyhunt.com/controlling-vehicle-features-of-nissan/&quot;&gt;sensitive data on the car and its owner&lt;/a&gt; (which is still a big deal!). On the scarier side is the risk that &lt;a href=&quot;https://www.wired.com/2015/07/hackers-remotely-kill-jeep-highway/&quot;&gt;hackers could exert more control&lt;/a&gt; over a big packet of kinetic energy with squishy humans inside.&lt;/p&gt;

&lt;p&gt;For businesses, IoT devices are likely the weakest link in a security strategy. A compromised IoT device could easily lead to a far more serious breach. Attackers use such breaches to &lt;a href=&quot;https://securityintelligence.com/ddos-extortion-easy-and-lucrative/&quot;&gt;extort money&lt;/a&gt; from businesses. With a high potential cost of failure, even an &lt;a href=&quot;http://www.computerworld.com/article/3061813/security/empty-ddos-threats-deliver-100k-to-extortion-group.html&quot;&gt;empty threat&lt;/a&gt; cannot be ignored.&lt;/p&gt;

&lt;h2 id=&quot;where-do-we-go-from-here&quot;&gt;Where do we go from here?&lt;/h2&gt;

&lt;p&gt;The media can help by separating fact from fiction. &lt;a href=&quot;https://www.theverge.com/2017/1/30/14438226/hackers-austrian-hotel-bitcoin-ransom-ransomware&quot;&gt;“Hotel ransomed by hackers as guests locked out of rooms”&lt;/a&gt; was a sensational headline that certainly drew some attention. But &lt;a href=&quot;http://www.tomshardware.com/news/ransomware-didnt-lock-hotel-rooms,33528.html&quot;&gt;it wasn’t true&lt;/a&gt; and only added to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt&quot;&gt;fear, uncertainty, and doubt&lt;/a&gt; surrounding the issue.&lt;/p&gt;

&lt;p&gt;The economic incentives described above need to change. We need to align manufacturers and consumers so security is at least considered. I’m not optimistic about this happening on its own. Historically, the free market does not address externalized problems well. You may have heard of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Tragedy_of_the_commons&quot;&gt;tragedy of the commons&lt;/a&gt;. This is where the &lt;a href=&quot;http://www.computerworld.com/article/3136650/security/after-ddos-attack-senator-seeks-industry-led-security-standards-for-iot-devices.html&quot;&gt;government might have to step in&lt;/a&gt;. No one likes regulations, but sometimes they are necessary. It works for pollution and it &lt;a href=&quot;https://www.schneier.com/blog/archives/2016/11/regulation_of_t.html&quot;&gt;could work here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We in the industry can help by making it easier to get security right. Stronger &lt;a href=&quot;https://www.schneier.com/blog/archives/2017/02/security_and_pr.html&quot;&gt;industry-supported guidelines&lt;/a&gt; would go a long way towards setting a baseline expectation. Besides the purely technical concerns, we need guidelines for design and user experience. &lt;a href=&quot;https://techgenix.com/security-vs-usability/&quot;&gt;Monique Magalhaes&lt;/a&gt; rightfully points out that “the highest levels of security can only be achieved with equivalent highest standards of usability. They depend on one another.” Making security features more accessible to the consumer would go a long way towards improving security.&lt;/p&gt;

&lt;p&gt;Whether we are businesses, journalists, technologists, or consumers, we need to enter this brave new world with eyes wide open. And while I hope my post freaks you out a little, I’m excited to see how we all come together to figure it out.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Security in the Age of the Internet of Things</title>
   <link href="http://www.rpherbig.com/2017/04/20/security-in-the-age-of-the-iot.html"/>
   <updated>2017-04-20T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2017/04/20/security-in-the-age-of-the-iot</id>
   <content type="html">&lt;link rel=&quot;canonical&quot; href=&quot;https://sep.com/blog/security-age-internet-things/&quot; /&gt;

&lt;p&gt;The Internet of Things is big. No, really big. No, even bigger than that. How big? My colleague Brad Boyer explains it better than I could (and handily defines the &lt;em&gt;thing&lt;/em&gt; part of IoT, too). &lt;a href=&quot;https://www.sep.com/sep-blog/2015/10/22/how-big-is-iot/&quot;&gt;Go read it&lt;/a&gt; - I’ll wait.&lt;/p&gt;

&lt;p&gt;Welcome back!&lt;/p&gt;

&lt;p&gt;Security is hard. No, really hard. Ok, maybe not quite as hard as that. But it is easy to get wrong. Easy enough that &lt;a href=&quot;https://www.owasp.org/&quot;&gt;OWASP&lt;/a&gt; publishes the &lt;a href=&quot;https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project&quot;&gt;Top 10 Most Critical Security Risks&lt;/a&gt; every few years, along with how to mitigate those risks. Yet those same vulnerabilities still appear in the wild. It is why we have sites like &lt;a href=&quot;https://haveibeenpwned.com/&quot;&gt;have i been pwned?&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The S in IoT stands for security&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://twitter.com/lino/status/776082366037102592&quot;&gt;@lino&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;there-are-new-attack-vectors&quot;&gt;There are new attack vectors&lt;/h2&gt;

&lt;p&gt;Many of the current-day IoT devices are only recently Internet-enabled. In some cases, they’re only recently even &lt;em&gt;digital&lt;/em&gt;. This is a radical shift in capabilities and platforms which results in new attack vectors that we are still trying to understand. We need to explore the implications of new devices with new capabilities in new contexts.&lt;/p&gt;

&lt;p&gt;A perfect example is the prevalence of accelerometers. They are in nearly every smart phone out there, as well as other devices people keep on their person like pedometers. However, many people do not know they are a component in their devices, and many of those devices trust the accelerometer data too much. Who would think of an accelerometer as an attack vector? &lt;a href=&quot;https://spqr.eecs.umich.edu/papers/trippel-IEEE-oaklawn-walnut-2017.pdf&quot;&gt;These researchers&lt;/a&gt;, for one. They came up with a series of &lt;a href=&quot;https://spqrlab1.github.io/pastprojects.html&quot;&gt;acoustic attacks&lt;/a&gt; that can inject false data.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://developer.amazon.com/alexa&quot;&gt;Alexa&lt;/a&gt; is the voice service that powers the Amazon Echo. This allows customers to use their voice to interact with devices. It is a great capability to have around the house, but its risk profile has to be carefully considered. We all know someone that enjoys pranks (there is a relevant &lt;a href=&quot;https://xkcd.com/1807/&quot; title=&quot;Listening&quot;&gt;XKCD&lt;/a&gt; for everything!) But I bet most customers never considered what could happen if a newscaster accidentally &lt;a href=&quot;https://www.theverge.com/2017/1/7/14200210/amazon-alexa-tech-news-anchor-order-dollhouse&quot;&gt;used the magic words&lt;/a&gt; on TV.&lt;/p&gt;

&lt;p&gt;I hope the buyer understood the implications of buying a &lt;a href=&quot;https://www.wired.com/2015/07/hackers-can-disable-sniper-rifleor-change-target/&quot;&gt;wireless-enabled sniper rifle&lt;/a&gt;. I hope the city council understood the implications of investing in &lt;a href=&quot;http://iotworm.eyalro.net/&quot;&gt;light bulbs that could talk to each other&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;new-types-of-data-can-be-exposed-in-a-breach&quot;&gt;New types of data can be exposed in a breach&lt;/h2&gt;

&lt;p&gt;Speaking of Alexa (see what I did there?), people are now realizing that in order to react to voice commands, Alexa must listen to (but not necessarily record) &lt;em&gt;everything&lt;/em&gt; that it can hear. Some people are comfortable with that and some are not, but it is something about which all customers need to be aware.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Once it detects the wake word, according to Amazon, the Echo starts streaming audio to the cloud, where it is secured until the customer permanently deletes it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Detectives &lt;a href=&quot;https://www.nytimes.com/2016/12/28/business/amazon-echo-murder-case-arkansas.html&quot;&gt;requested access to the audio data&lt;/a&gt; from an Echo in a murder case. What is the “reasonable expectation of privacy” when &lt;a href=&quot;http://nymag.com/selectall/2016/12/can-an-amazon-echo-testify-against-you.html&quot;&gt;dealing with a device that is always listening&lt;/a&gt;? What happens if &lt;a href=&quot;https://www.washingtonpost.com/news/the-switch/wp/2016/12/28/can-alexa-help-solve-a-murder-police-think-so-but-amazon-wont-give-up-her-data/&quot;&gt;police misunderstand how the technology works&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Let us look at a different data point: your heart rate. That can tell you a lot about someone. How active they are, and when. When they are asleep. If they are ill or have a chronic medical condition. Pacemakers are an obvious collector of that data. Indeed, in &lt;a href=&quot;https://www.washingtonpost.com/news/to-your-health/wp/2017/02/08/a-man-detailed-his-escape-from-a-burning-house-his-pacemaker-told-police-a-different-story/&quot;&gt;at least one case&lt;/a&gt; that data was used to &lt;a href=&quot;http://www.networkworld.com/article/3162740/security/cops-use-pacemaker-data-as-evidence-to-charge-homeowner-with-arson-insurance-fraud.html&quot;&gt;prove arson and insurance fraud&lt;/a&gt;. Now there are more and more devices that a user might not expect to record their heart rate (for example, pedometers). One couple &lt;a href=&quot;http://mashable.com/2016/02/10/fitbit-pregnant/#f5IK5c8vDPqT&quot;&gt;found out they were pregnant&lt;/a&gt; via their FitBit data.&lt;/p&gt;

&lt;p&gt;Imagine what would happen if the data store were breached. Building profiles of consumers is &lt;a href=&quot;http://www.nytimes.com/2012/02/19/magazine/shopping-habits.html&quot;&gt;nothing new&lt;/a&gt;, but now there are more ways to gather more data.&lt;/p&gt;

&lt;p&gt;Samsung’s new smart fridge can &lt;a href=&quot;http://newatlas.com/samsung-family-hub-smart-fridge/41192/&quot;&gt;report its contents&lt;/a&gt;. What is the risk profile of that data being leaked? If your fridge is empty, maybe you’re on vacation. The type of food you eat affects your health. The cost of the food you eat gives a glimpse into your finances. This information could be valuable to a malicious actor. A smart thermostat could have &lt;a href=&quot;https://www.youtube.com/watch?v=DKE-pWA68Ac&quot;&gt;similar risks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Children’s toys are now joining the IoT, which brings up new privacy concerns. Germany has already &lt;a href=&quot;http://www.telegraph.co.uk/news/2017/02/17/germany-bans-internet-connected-dolls-fears-hackers-could-target/&quot;&gt;banned one such toy&lt;/a&gt;, and security researchers are &lt;a href=&quot;http://www.huffingtonpost.com.au/entry/hello-barbie-security-concerns_us_565c4921e4b072e9d1c24d22&quot;&gt;concerned about another&lt;/a&gt;. When sensitive data is held by a third party, consumers need to consider the worst case. What happens when &lt;a href=&quot;https://motherboard.vice.com/en_us/article/internet-of-things-teddy-bear-leaked-2-million-parent-and-kids-message-recordings&quot;&gt;kids’ voice messages are leaked&lt;/a&gt;? Won’t somebody please &lt;a href=&quot;https://www.youtube.com/watch?v=RybNI0KB1bg&quot;&gt;think of the children&lt;/a&gt;?&lt;/p&gt;

&lt;h2 id=&quot;vulnerabilities-are-common-and-easy-to-find&quot;&gt;Vulnerabilities are common and easy to find&lt;/h2&gt;

&lt;p&gt;IoT devices are marketed at a very broad audience, meaning consumers are less likely to be technologically adept. That makes &lt;a href=&quot;https://krebsonsecurity.com/2016/02/iot-reality-smart-devices-dumb-defaults/&quot;&gt;secure default settings&lt;/a&gt; critically important, which many devices do not have. Even worse, many do not make it easy to change those defaults even if the consumer is aware of the need.&lt;/p&gt;

&lt;p&gt;Manufacturers commonly load devices with a default username and password, which is &lt;a href=&quot;http://www.routerpasswords.com/&quot;&gt;easily looked up&lt;/a&gt;. However, some devices take this a step further and have hardcoded credentials which the &lt;a href=&quot;http://blog.talosintelligence.com/2016/02/trane-iot.html&quot;&gt;user &lt;em&gt;cannot&lt;/em&gt; change&lt;/a&gt;. Typically these hardcoded credentials are &lt;a href=&quot;https://www.flashpoint-intel.com/blog/cybercrime/when-vulnerabilities-travel-downstream/&quot;&gt;not even mentioned to the user&lt;/a&gt;, leaving them unaware of a large hole in their security profile. One of the more recent and nefarious malware packages, Mirai, scans for IoT devices that have &lt;a href=&quot;https://ipvm.com/reports/ip-cameras-default-passwords-directory&quot;&gt;known credentials&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In many cases a single manufacturer produces many devices with different brands (this is known as a &lt;a href=&quot;https://en.wikipedia.org/wiki/White-label_product&quot;&gt;white label product&lt;/a&gt;). The wide-spread nature of this business practice leads to what is known as a &lt;a href=&quot;https://www.edge.org/annual-question/2017/response/27229&quot;&gt;class break&lt;/a&gt;, where one smart person can come up with one clever hack that &lt;a href=&quot;https://blog.sucuri.net/2016/09/iot-home-router-botnet-leveraged-in-large-ddos-attack.html&quot;&gt;breaks an entire class of systems&lt;/a&gt;. In fact, that is exactly what happened when the Mirai author &lt;a href=&quot;https://krebsonsecurity.com/2016/10/source-code-for-iot-botnet-mirai-released/&quot;&gt;released their source code&lt;/a&gt;. That malware &lt;a href=&quot;https://motherboard.vice.com/en_us/article/internet-of-things-malware-mirai-ddos&quot;&gt;is not even very advanced&lt;/a&gt;, but it nonetheless effective. If a vulnerability is found in one device, many other brands and models may &lt;a href=&quot;https://pcidss.wordpress.com/2016/10/10/iot-botnets-white-label-risks-bad-customer-experience-and-what-it-means-from-our-post-iot-attack-analysis-threatpost/&quot;&gt;also be affected&lt;/a&gt;. Discovering which devices are the same, however, is something the vendors &lt;a href=&quot;https://krebsonsecurity.com/2016/10/who-makes-the-iot-things-under-attack/&quot;&gt;do not make easy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vulnerable devices have never been easier to find. There is even a &lt;a href=&quot;https://www.shodan.io/&quot;&gt;search engine for the Internet of Things&lt;/a&gt;. Shodan makes it easy to &lt;a href=&quot;https://arstechnica.com/security/2016/01/how-to-search-the-internet-of-things-for-photos-of-sleeping-babies/&quot;&gt;search the web for IoT devices&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;vulnerabilities-are-hard-to-fix&quot;&gt;Vulnerabilities are hard to fix&lt;/h2&gt;

&lt;p&gt;Windows users have only recently gotten used to regularly updating their computers, and Microsoft has been working on that for many years. How many people think “it’s Tuesday, time to check if my refrigerator needs any software updates”? Many IoT devices are &lt;a href=&quot;https://www.wired.com/2014/01/theres-no-good-way-to-patch-the-internet-of-things-and-thats-a-huge-problem/&quot;&gt;not even designed to be updated&lt;/a&gt;. This means once a vulnerability is discovered, it is only a matter of time until that device is compromised. Even if the device is factory reset, without an update it will be breached again. Even for some of the devices that support updates, &lt;a href=&quot;https://www.trane.com/residential/en/resources/smart-home-automation/installing-upgrading.html&quot;&gt;it is not always easy&lt;/a&gt;. Combine that with the fact that some of the devices have an expected lifespan of 10 or more years and you can see how big of a problem this is.&lt;/p&gt;

&lt;h2 id=&quot;why-should-businesses-and-consumers-care&quot;&gt;Why should businesses and consumers care?&lt;/h2&gt;

&lt;p&gt;I have described above what could happen in the event of a breach. Some sensitive data could be leaked with some serious consequences. But there are more reasons than that.&lt;/p&gt;

&lt;p&gt;One easy answer is that a vulnerable IoT device is likely the weakest link in a security strategy. A compromised IoT device has nearly the same threat profile as any other compromised device on a network.&lt;/p&gt;

&lt;p&gt;What if “we do not have anything of value on our [network/site/etc.]”? You still have your &lt;a href=&quot;https://www.troyhunt.com/all-websites-have-something-of-value-for-attackers-reputation/&quot;&gt;reputation to think of&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Malicious actors are now using some compromised devices to anonymize their activity. The device is &lt;a href=&quot;https://krebsonsecurity.com/2016/10/iot-devices-as-proxies-for-cybercrime/&quot;&gt;turned into a proxy&lt;/a&gt; through which the hacking, spamming, DDoS, or other attacks are launched. This makes it harder to catch the criminals, and introduces the possibility of innocent people being caught up in the investigation.&lt;/p&gt;

&lt;p&gt;Unfortunately, with the &lt;a href=&quot;https://krebsonsecurity.com/2016/12/researchers-find-fresh-fodder-for-iot-attack-cannons/&quot;&gt;proliferation of vulnerable devices&lt;/a&gt; and malware that can compromise them, criminals are building massive botnets. They use these botnets to &lt;a href=&quot;https://securityintelligence.com/ddos-extortion-easy-and-lucrative/&quot;&gt;extort money&lt;/a&gt;, &lt;a href=&quot;https://krebsonsecurity.com/2016/09/the-democratization-of-censorship/&quot;&gt;censor opponents&lt;/a&gt;, or whatever &lt;a href=&quot;https://www.forbes.com/sites/thomasbrewster/2016/10/23/massive-ddos-iot-botnet-for-hire-twitter-dyn-amazon/&quot;&gt;they can make money doing&lt;/a&gt;. Even an &lt;a href=&quot;http://www.computerworld.com/article/3061813/security/empty-ddos-threats-deliver-100k-to-extortion-group.html&quot;&gt;empty threat&lt;/a&gt; is enough, sometimes. And these attacks are only &lt;a href=&quot;https://en.wikipedia.org/wiki/DDoS_attack_on_Dyn&quot;&gt;growing in scale&lt;/a&gt; as &lt;a href=&quot;http://www.ibtimes.co.uk/biggest-ever-terabit-scale-ddos-attack-yet-could-be-horizon-experts-warn-1588364&quot;&gt;time goes on&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Liability is murky in many of these cases, until it is tested in the courts, and there is a lot at stake. Take cars, for example. On the tame end of the vulnerability spectrum is being able to get access to &lt;a href=&quot;https://www.troyhunt.com/controlling-vehicle-features-of-nissan/&quot;&gt;sensitive data on the car and its owner&lt;/a&gt; (still a big deal!). On the scarier side is the risk that &lt;a href=&quot;https://www.wired.com/2015/07/hackers-remotely-kill-jeep-highway/&quot;&gt;hackers could exert more control&lt;/a&gt; over a big packet of kinetic energy with squishy humans inside.&lt;/p&gt;

&lt;h2 id=&quot;so-why-dont-they-care&quot;&gt;So why don’t they care?&lt;/h2&gt;

&lt;p&gt;Thankfully, Bruce Schneier &lt;a href=&quot;https://www.schneier.com/essays/archives/2016/10/we_need_to_save_the_.html&quot;&gt;has a great explanation&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Think of all the CCTV cameras and DVRs used in the &lt;a href=&quot;https://krebsonsecurity.com/2016/09/krebsonsecurity-hit-with-record-ddos/&quot;&gt;attack against Brian Krebs&lt;/a&gt;. The owners of those devices do not care. Their devices were cheap to buy, they still work, and they do not even know Brian. The sellers of those devices do not care: they are now selling newer and better models, and the original buyers only cared about price and features. Insecurity is what economists call an externality: it’s an effect of the purchasing decision that affects other people. Think of it kind of like invisible pollution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is similar to how credit card fraud primarily affects &lt;a href=&quot;https://www.troyhunt.com/relax-its-only-your-credit-card-near/&quot;&gt;merchants and banks&lt;/a&gt;, not the end user.&lt;/p&gt;

&lt;p&gt;Criminals sometimes find it more lucrative to keep their presence hidden and &lt;a href=&quot;https://krebsonsecurity.com/2011/04/is-your-computer-listed-for-rent/&quot;&gt;rent out the compromised device&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Maybe consumers will start to take notice if a &lt;a href=&quot;https://arstechnica.com/security/2017/04/rash-of-in-the-wild-attacks-permanently-destroys-poorly-secured-iot-devices/&quot;&gt;new trend of malware&lt;/a&gt; continues to spread that &lt;a href=&quot;https://www.bleepingcomputer.com/news/security/new-malware-intentionally-bricks-iot-devices/&quot;&gt;permanently disables&lt;/a&gt; any &lt;a href=&quot;https://www.theregister.co.uk/2017/04/08/brickerbot_malware_kills_iot_devices/&quot;&gt;vulnerable IoT devices&lt;/a&gt; it can find.&lt;/p&gt;

&lt;h2 id=&quot;why-is-iot-different-than-what-we-have-seen-in-the-past&quot;&gt;Why is IoT different than what we have seen in the past?&lt;/h2&gt;

&lt;p&gt;These are the growing pains we have seen countless times before (and will again in the future) across various industries. Devices are being connected in new and novel ways. The “arms race” between attack and defense is changing very rapidly. New techniques are being developed on both sides.&lt;/p&gt;

&lt;p&gt;However, now the number of devices involved is much larger, with a correspondingly larger impact if things go wrong. Why is that?&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Never before have so many connected devices been so physically accessible&lt;/li&gt;
  &lt;li&gt;Many of these devices are being made by companies without a strong background in security&lt;/li&gt;
  &lt;li&gt;Speed to market is a key metric in this emerging market&lt;/li&gt;
  &lt;li&gt;This lends itself to cutting corners (or doing the bare minimum) when possible&lt;/li&gt;
  &lt;li&gt;Security is not a competitive advantage, so it often deprioritized&lt;/li&gt;
  &lt;li&gt;Supporting products after manufacturing requires a certain mindset (businessset?)&lt;/li&gt;
  &lt;li&gt;Deploying updates (or at least notifying the public of vulnerabilities) requires an investment in infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, security is not often made a priority or given enough attention (either time or money).&lt;/p&gt;

&lt;p&gt;Won’t the market self-correct? Not with the current economic incentives. Neither the manufacturer nor consumer have a reason to prioritize security because the cost of failure is externalized. Even if the consumer were security conscious, there is too much &lt;a href=&quot;https://en.wikipedia.org/wiki/Information_asymmetry&quot;&gt;information asymmetry&lt;/a&gt; between consumers and manufacturers. Consumers cannot easily find most of the information they would need to truly evaluate competing products.&lt;/p&gt;

&lt;h2 id=&quot;where-do-we-go-from-here&quot;&gt;Where do we go from here?&lt;/h2&gt;

&lt;p&gt;Probably the most important things is to carefully separate truth from fearmongering. &lt;a href=&quot;https://www.theverge.com/2017/1/30/14438226/hackers-austrian-hotel-bitcoin-ransom-ransomware&quot;&gt;“Hotel ransomed by hackers as guests locked out of rooms”&lt;/a&gt; makes for a sensational headline - it is sure to get a bunch of clicks. But &lt;a href=&quot;http://www.tomshardware.com/news/ransomware-didnt-lock-hotel-rooms,33528.html&quot;&gt;it wasn’t true&lt;/a&gt; and only added to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt&quot;&gt;fear, uncertainty, and doubt&lt;/a&gt; surrounding the issue. This is how we make sure we are solving the right problems, and not protecting against unrealistic &lt;a href=&quot;https://www.schneier.com/blog/archives/2006/04/announcing_movi.html&quot;&gt;movie plot threats&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We need to change the economic incentives described above. To align manufacturers and consumers so security is at least considered. It is even better if consumers can be aware of the risks that the IoT introduces and deliberate about their use of these devices. However, I am not optimistic about this. Historically, the market does not address externalized problems well.&lt;/p&gt;

&lt;p&gt;That is where &lt;a href=&quot;http://www.computerworld.com/article/3136650/security/after-ddos-attack-senator-seeks-industry-led-security-standards-for-iot-devices.html&quot;&gt;government regulation comes in&lt;/a&gt;. No one likes regulation for its own sake. No one wants the government involved unless it is necessary. But regulation works for pollution and other externalized problems (you’ve probably heard of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Tragedy_of_the_commons&quot;&gt;tragedy of the commons&lt;/a&gt;), and it &lt;a href=&quot;https://www.schneier.com/blog/archives/2016/11/regulation_of_t.html&quot;&gt;could work here&lt;/a&gt; too.&lt;/p&gt;

&lt;p&gt;At the same time, we need to find a way to make security easier to get right. For software and hardware development, &lt;a href=&quot;https://www.schneier.com/blog/archives/2017/02/security_and_pr.html&quot;&gt;industry-supported guidelines&lt;/a&gt; would go a long way to setting a baseline expectation. In addition to the purely technical concerns, we need guidelines for design and user experience. &lt;a href=&quot;https://techgenix.com/security-vs-usability/&quot;&gt;Monique Magalhaes&lt;/a&gt; rightfully points out that “the highest levels of security can only be achieved with equivalent highest standards of usability. They depend on one another.” Making security features more accessible to the consumer would go a long way towards improving security.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Refactoring JavaScript - a play in three acts</title>
   <link href="http://www.rpherbig.com/2017/04/10/refactoring-javascript.html"/>
   <updated>2017-04-10T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2017/04/10/refactoring-javascript</id>
   <content type="html">&lt;h1 id=&quot;act-1-the-setup&quot;&gt;Act 1, the setup&lt;/h1&gt;

&lt;p&gt;Once upon a time, there was a JavaScript codebase. This codebase used the &lt;em&gt;function expression&lt;/em&gt; syntax:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;returnTheNumberOne&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For reasons that aren’t relevant to this blog post, I needed to replace this with the &lt;em&gt;function declaration&lt;/em&gt; syntax:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;returnTheNumberOne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;act-2-the-confrontation&quot;&gt;Act 2, the confrontation&lt;/h1&gt;

&lt;p&gt;Usually some clever find-and-replace (read: regular expressions), mixed with a bit of manual labor, would take care of this quickly enough. I started down that path with a few minutes of tinkering.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Some people, when confronted with a problem, think “I know, I’ll use regular expressions.”  Now they have two problems.
&lt;a href=&quot;http://regex.info/blog/2006-09-15/247&quot;&gt;Jamie Zawinski&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It didn’t take me long to realize I needed to find a better way:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The codebase had different types of &lt;em&gt;function expressions&lt;/em&gt;, which meant I would need to write several different regular expressions.&lt;/li&gt;
  &lt;li&gt;This same transform would be used later on a different codebase, so I wanted something flexible and repeatable.&lt;/li&gt;
  &lt;li&gt;There was also a good chance that someone else would be doing this next time, so I wanted something others could understand easily.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&quot;act-3-the-resolution&quot;&gt;Act 3, the resolution&lt;/h1&gt;

&lt;p&gt;Enter &lt;a href=&quot;https://github.com/facebook/jscodeshift&quot;&gt;JSCodeShift&lt;/a&gt;, stage left. JSCodeShift turns JavaScript files into an &lt;a href=&quot;https://en.wikipedia.org/wiki/Abstract_syntax_tree&quot;&gt;abstract-syntax tree&lt;/a&gt; (AST). This provides an object model that can be used to do more complicated transforms than could be done on context-less text.&lt;/p&gt;

&lt;p&gt;The wonderful &lt;a href=&quot;http://astexplorer.net/&quot;&gt;AST Explorer&lt;/a&gt; will show what the AST looks like for both our input and target. I’ve marked up the ASTs from the two code snippets above to show how they are related. This should help explain what needs to be transformed and how.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/AST_to_code_mapping.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A codemod is JavaScript code which will operate on the nodes in the AST. Typically, it will find nodes that match some pattern and replace them with something else. At a high level, it could look something like this:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;j&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;codeshift&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;replaceNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;nodePath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;replaceWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;replaceNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Using the AST for the input code, the target is any &lt;em&gt;VariableDeclaration&lt;/em&gt; node which contains an &lt;em&gt;ArrowFunctionExpression&lt;/em&gt; node.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;VariableDeclaration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;na&quot;&gt;declarations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;
                &lt;span class=&quot;na&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                  &lt;span class=&quot;na&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;ArrowFunctionExpression&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;span class=&quot;p&quot;&gt;}]&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;replaceWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;According to the AST for the target code, what we found will be replaced with a &lt;em&gt;FunctionDeclaration&lt;/em&gt; node. If we created this node by hand, we would have to manage a lot of AST-related details: line numbers, object references, parent relationships, etc. Luckily JSCodeShift provides builder functions such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;j.functionDeclaration(...)&lt;/code&gt; to do that for us. According to the &lt;a href=&quot;https://github.com/benjamn/ast-types/blob/master/def/core.js#L174-L177&quot;&gt;FunctionDeclaration definition&lt;/a&gt;, that node is built with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;id&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;params&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;body&lt;/code&gt;. We can get those from the &lt;em&gt;VariableDeclaration&lt;/em&gt; and &lt;em&gt;ArrowFunctionExpression&lt;/em&gt; nodes we found above.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;replaceNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;nodePath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;nodePath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;variableDeclarator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;declarations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;arrowFunctionExpression&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;variableDeclarator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;functionDeclaration&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;variableDeclarator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;arrowFunctionExpression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;arrowFunctionExpression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...)&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;replaceWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;replaceNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
           &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toSource&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;It can take a little while to write a codemod, so a find/replace can still be faster in simple cases. There are also some cases in which small text changes result in significant changes to the AST that would require writing a second codemod. Analyzing the AST from this snippet is left as an exercise to the reader:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;helper&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;helper&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Also, the way code comments are handled surprised me: they are properties of the closest node in the AST. That means they must be copied manually if you are changing that node.&lt;/p&gt;

&lt;p&gt;JSCodeShift makes difficult or complicated code transforms much easier. The resulting code is far more readable than a regex. And when best practices change in the future, the codemod is easy to revisit, understand, and update for the new standard. The neverending march of progress just got easier.&lt;/p&gt;

&lt;p&gt;JSCodeShift is a powerful new tool in our toolbox, though not one we’ll use every day.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Links used in this post:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Abstract_syntax_tree&quot;&gt;Wikipedia page for abstract-syntax tree&lt;/a&gt; (AST)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/facebook/jscodeshift&quot;&gt;JSCodeShift on GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://astexplorer.net/&quot;&gt;AST Explorer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/benjamn/ast-types/tree/master/src/def&quot;&gt;AST type definitions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 <entry>
   <title>Growing a Community</title>
   <link href="http://www.rpherbig.com/2016/11/10/growing-a-community.html"/>
   <updated>2016-11-10T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2016/11/10/growing-a-community</id>
   <content type="html">&lt;p&gt;This is part of an ongoing series of posts about a side project I am working on with &lt;a href=&quot;http://rcuhljr.github.io/&quot;&gt;Rob Uhl&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/2016/09/30/a-lot-can-happen-in-a-year.html&quot;&gt;Introduction - A Lot Can Happen in a Year&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://rcuhljr.github.io/blog/2016/10/07/side-project-lessons-part1.html&quot;&gt;Building Your Castle in a Swamp&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://rcuhljr.github.io/blog/2016/10/19/side-project-lessons-part2.html&quot;&gt;Dependency Resolution&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/2016/10/31/why-are-we-writing-these-scripts.html&quot;&gt;Why Are We Writing These Scripts?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;the-dragonrealms-community&quot;&gt;The DragonRealms community&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;com·mu·ni·ty&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;&lt;strong&gt;a group of people living in the same place or having a particular characteristic in common.&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;a feeling of fellowship with others, as a result of sharing common attitudes, interests, and goals.&lt;/li&gt;
    &lt;li&gt;a group of interdependent organisms of different species growing or living together in a specified habitat.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;When I started playing DragonRealms (DR), I wasn’t really focused on the community. I was busy learning new mechanics, exploring the world, and listening to Rob wax nostalgic about his time in DR (15 years ago). And to be honest, the game systems themselves somewhat discouraged new players from interacting with other players:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I had no money to buy things from the community, and no skills that can contribute back to the community (e.g. crafting)&lt;/li&gt;
  &lt;li&gt;Most of my time was spent hunting rats to make enough coin to repair my gear to get back out hunting rats&lt;/li&gt;
  &lt;li&gt;Specific player-made items (which I could not afford) are needed to access most of the in-game chat systems&lt;/li&gt;
  &lt;li&gt;Many questions were answered with a link to the &lt;a href=&quot;https://elanthipedia.play.net/Main_Page&quot;&gt;(mostly) official wiki&lt;/a&gt;, but just enough content is inaccurate or out of date to confuse a new player&lt;/li&gt;
  &lt;li&gt;There is a newbie help chat system which includes other newbies and volunteer mentors (members of the DR community who are of above-average helpfulness) - though as volunteers, they aren’t always available&lt;/li&gt;
  &lt;li&gt;The character-growth model of DR (perhaps the subject of a future blog post) encourages players to maximize the number of skills they train, which disincentivizes players from spending time idle (e.g. chatting or helping a new person)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I mean, you &lt;em&gt;know&lt;/em&gt; you are part of a community when you play a multiplayer game, but at first you don’t really KNOW it… you know? Luckily for me, Rob was a great help, as were a few other players I ran into by seeking out popular hangout spots. And as with any other community, there is a learning curve: 20 years of informal rules, systems, and conventions have formed. Some of those are unspoken, undocumented, and few people will take the time to explain them. Ask me about the NPC healer sometime… It’s also hard when most of the in-game chat systems are strictly “in character” - that is, from your character’s point of view. It’s hard to get Ogg the Barbarian to explain the nuances of a complex system, even if Ogg’s player wants to help.&lt;/p&gt;

&lt;p&gt;DR’s chat channels have the &lt;a href=&quot;https://www.penny-arcade.com/comic/2004/03/19&quot;&gt;usual problems&lt;/a&gt; (strong language warning!) that crop up when you mix a normal person, anonymity, and an audience. There are some official policies around how this is kept in check, and the topic comes up constantly in DR forum discussions. There are even changes being implemented right now to the chat systems to try and reduce trolling and griefing (being deliberately irritating to upset others). I suspect there are many reasons for this, and it’s not an easy problem to solve.&lt;/p&gt;

&lt;h2 id=&quot;the-lich-community&quot;&gt;The Lich community&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;com·mu·ni·ty&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;a group of people living in the same place or having a particular characteristic in common.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;a feeling of fellowship with others, as a result of sharing common attitudes, interests, and goals.&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;a group of interdependent organisms of different species growing or living together in a specified habitat.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;One of the things that &lt;a href=&quot;https://lichproject.org/&quot;&gt;Lich&lt;/a&gt; supports by default is a set of chat channels (hereafter, Lnet) that go through the Lich servers, rather than the DR servers. That means those channels do not need to adhere to the DR policies. DR does not (&lt;a href=&quot;http://forums.play.net/forums/DragonRealms/The%20Moon%20Mages/General%20Discussions%20-%20Moon%20Mages/thread/1811680&quot;&gt;and will not&lt;/a&gt;) support out-of-character (OOC) chat, whereas Lnet does.&lt;/p&gt;

&lt;p&gt;I believe this strengthens the Lich community - I’ve seen wonderful conversations on Lnet about life, careers, and relationships. In addition, the Lich community is much more positive than that of DR in general. I constantly see people healing others, discounting services (or even giving services and items away), answering questions on game mechanics or scripts, and so on. This cooperation and collaboration has a positive feedback effect.&lt;/p&gt;

&lt;p&gt;There are a few training strategies that have become pretty popular in the Lich community (optimizing training would be a good future blog post), one of which requires a specific item that is hard to get. One generous Licher went and bought 20 of the item and handed them out to everyone that needed one - but they still had 10 left over. They wanted a way to make the items accessible to other Lichers in the future, but DR does not have an easy way to do that. In order to support cooperation, we created a character who only exists to share items within the community. Anyone can contribute items or request them.&lt;/p&gt;

&lt;p&gt;We have another player whose character is a healer. He could be out in the game world training, but instead has decided to contribute back to the community by making himself available to heal Lichers. Everyone knows to first check if he is around before finding another healer (who are often slower and charge money for their services).&lt;/p&gt;

&lt;p&gt;The Lich community is also resilient to disruption. A few months ago some well-known trolls and griefers joined Lnet. With their usual tactics, they tried to antagonize Lichers, who wisely decided not to engage with their antics. Instead, we simply continued having fun. Without people feeding their bad behavior, they got bored and either left or stopped being disruptive. Either way, the Lich community is better for it (and maybe we converted some of them to be productive members!). I hope that as we get more popular and our population grows, we will continue to foster good behavior.&lt;/p&gt;

&lt;h2 id=&quot;a-community-within-a-community&quot;&gt;A community within a community&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;com·mu·ni·ty&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
    &lt;li&gt;a group of people living in the same place or having a particular characteristic in common.&lt;/li&gt;
    &lt;li&gt;a feeling of fellowship with others, as a result of sharing common attitudes, interests, and goals.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;a group of interdependent organisms of different species growing or living together in a specified habitat.&lt;/strong&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we &lt;a href=&quot;https://github.com/rpherbig/dr-scripts/commit/1f41330ff94a3220ae80d89f29b91304c1382f80&quot;&gt;began writing our scripts&lt;/a&gt;, we took a very Agile approach. Write what we needed for our characters, add settings and configuration that worked for us, and expand the scripts’ capabilities over time as we encountered new needs or edge cases. This was fantastic for rapid development - getting the most functionality in the least development time.&lt;/p&gt;

&lt;p&gt;But it also meant that we tackled error paths and edge cases as we encountered them. Our code was not perfectly robust from the start, and for the most part, that was fine. Most errors just stopped a script, and since we were at the keyboard, we would fix the problem and restart it. At worst a character might lose an item (ask Rob about his cleric’s shield sometime).&lt;/p&gt;

&lt;p&gt;But occasionally, rarely, there would be a bug that was &lt;em&gt;noisy&lt;/em&gt;. Typically these errors would be a broken &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;while&lt;/code&gt; loop or bad conditional &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;return&lt;/code&gt; that would result in spamming a room with commands. Even if we reacted in a few seconds, hundreds of commands would have been sent. After the first of these it was clear that we had to be responsible members of the scripting (and/or Lich) community, as members of the larger DR community.&lt;/p&gt;

&lt;p&gt;To that end, we implemented a few different strategies in our scripts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Be deliberate about pausing between commands or actions. In many cases, this is as simple as sending an action, then waiting until we see text that indicates the action was taken.&lt;/li&gt;
  &lt;li&gt;Check for repeated actions. For example, movement: do not go to one room only to immediately leave for a second room; instead we write a bit more code to detect this case and go directly to the second room.&lt;/li&gt;
  &lt;li&gt;Use timers to check for infrequent game state changes, rather than checking more frequently. For example, characters can teach a class, but this is rare. We only check for active classes every few minutes.&lt;/li&gt;
  &lt;li&gt;Avoid using common hangout spots for training. This keeps spammy training processes away from players that want to congregate and interact with each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The truth is that we need to be careful that our scripts do not negatively impact those around us. Furthermore, we need to be acutely aware of the &lt;em&gt;perception&lt;/em&gt; of others in the DR community. Even though we are following the &lt;a href=&quot;https://elanthipedia.play.net/Policy:Scripting_policy&quot;&gt;official scripting policy&lt;/a&gt;, some people take offense to our use of scripts. It is common for those players to try to break our scripts, for example, by slipping an item into a character’s hand. Our scripts need to be robust and handle unexpected game state, as well as being careful when recovering from an error.&lt;/p&gt;

&lt;h2 id=&quot;testimonials&quot;&gt;Testimonials&lt;/h2&gt;

&lt;p&gt;I asked on Lnet what they thought about the Lich community (names have been removed for privacy):&lt;/p&gt;

&lt;p&gt;Person ‘K1’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The collaborative effort is certainly helpful. Lnet is extremely helpful. Whereas my experiences with genie [an alternative front end and scripting solution] were rather… solo. Even when my friend and i helped develop some plugins for genie, it still felt like the community kept the best secrets to individuals. Knowledge-sharing wasn’t a big thing. it was still the “i’ll share a bit, but my script will always be better”. For example, the necro healing conversation that we’ve have been having. Wouldn’t have really happened when i was rockin’ genie seriously.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘M’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The community aspect definitely isn’t something to understate.  DR-lich is super friendly and helpful.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘A’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;By the way just wanted to thank everyone in lich for being so helpful. I wasn’t sure if I was going to stick around but going to be upgrading my account and unlocking my old one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘F’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I just started playing this again because they sent out free codes. If it weren’t for the lich community, I’d be gone again already.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘K2’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I think the real linchpin of Lich is the fact that so many of us remain &lt;em&gt;because of&lt;/em&gt; Lnet. Lnet demonstrates that OOC chat can be friendly and helpful. I’ve read on the official forums that Lnet chat is horrible and trollish, and that just has not been my experience. We’ve managed to not have Lnet turn into Barrens chat, as it were. I suspect because collectively we’ve gone out of our way to be helpful, whereas the game world simply doesn’t allow for it in meaningful ways.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>Why Are We Writing These Scripts?</title>
   <link href="http://www.rpherbig.com/2016/10/31/why-are-we-writing-these-scripts.html"/>
   <updated>2016-10-31T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2016/10/31/why-are-we-writing-these-scripts</id>
   <content type="html">&lt;p&gt;This is part of an ongoing series of posts about a side project I am working on with &lt;a href=&quot;http://rcuhljr.github.io/&quot;&gt;Rob Uhl&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/2016/09/30/a-lot-can-happen-in-a-year.html&quot;&gt;Introduction - A Lot Can Happen in a Year&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://rcuhljr.github.io/blog/2016/10/07/side-project-lessons-part1.html&quot;&gt;Building Your Castle in a Swamp&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://rcuhljr.github.io/blog/2016/10/19/side-project-lessons-part2.html&quot;&gt;Dependency Resolution&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;We’ve talked a lot about the infrastructure we’re working with, but haven’t spent much time on what it is we’re actually building (or, for that matter, why). At a low level, a script is simply a Ruby file with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.lic&lt;/code&gt; extension. At a higher level, a script is a way to automate some manual steps. It can only do what a user can do, albeit with more speed and accuracy.&lt;/p&gt;

&lt;h2 id=&quot;why-use-scripts&quot;&gt;Why use scripts?&lt;/h2&gt;

&lt;p&gt;Speed and accuracy are definitely advantages over not using scripts - not to mention making sure you don’t forget a step when doing something involved. Many games have taken the approach of disallowing scripting in any real sense (see: World of Warcraft macros). &lt;a href=&quot;https://www.play.net/dr/&quot;&gt;DragonRealms&lt;/a&gt; (DR), however, has quite a liberal &lt;a href=&quot;https://elanthipedia.play.net/Policy:Scripting_policy&quot;&gt;scripting policy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DR has been in development for over 20 years. Over that time, many systems have been introduced, modified, removed, and reimplemented. As in any large-scale software effort, sometimes the new and old system coexist for a time. Sometimes a very long time. For example, there are hundreds of non-player characters (NPCs) from whom you buy various items.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Some of these NPCs use one system in which you must &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;read&lt;/code&gt; from an item in the room to see what they sell (usually a catalog, a register, or one of several other nouns). Then you issue the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;buy&lt;/code&gt; command, which does not actually buy the item, but instead asks the NPC how much they want for it. Then you &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;offer&lt;/code&gt; the amount to complete the transaction.&lt;/li&gt;
  &lt;li&gt;Other NPCs use a system in which you &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;order&lt;/code&gt; to see what they have available, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;order item&lt;/code&gt; to complete the transaction.&lt;/li&gt;
  &lt;li&gt;Some of the NPCs that use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;order&lt;/code&gt; treat &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;order item&lt;/code&gt; as a request, which then requires you to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;order item&lt;/code&gt; a second time to complete the transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I consider remembering which NPC uses which system to be mental overhead. For me, dealing with three different ways just to buy an item from an NPC takes me out of the game - it breaks my immersion. I want to think at the ‘buy an item’ level of abstraction. So I took the time to write a script that deals with the &lt;em&gt;how&lt;/em&gt;. From now on, I can use that script (and reuse that code in other scripts), letting me think in terms of &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;focus-on-what-is-fun&quot;&gt;Focus on what is fun&lt;/h2&gt;

&lt;p&gt;Let’s look at crafting (I’ll be using Forging for these examples, but the points apply to all crafts). In DR, it is very involved - there are many steps, each in the right order, and you have to watch for random mistakes to appear and then correct them. One person’s deep, rewarding, and immersive crafting experience is another person’s tedium. That’s where scripts come in: letting you, the player, think at whatever level of abstraction is the most fun for you. I think that’s pretty awesome.&lt;/p&gt;

&lt;p&gt;At the lowest level of abstraction is the player that wants to do it by hand (and there’s nothing wrong with that!). They’re going to type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pound ingot on anvil with my hammer&lt;/code&gt;, wait to see if their character made a mistake (such as because they’re making a difficult item relative to their skill level), then type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;push my bellows&lt;/code&gt; to keep the flames hot, and so on - continuing until the process is complete. Very immersive, very much a role-playing game. You can practically feel the heat on your face as you read the text (seriously - the text is DR is very well-written!):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Sparks fly into the air as you transfer the scissors back and forth between the forge fires and the anvil, alternating heating with vigorous hammering of the metal.  The work proceeds as planned and you avoid introducing any defects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But for those that want it, we have a script named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;forge&lt;/code&gt; which automates the crafting steps only. It starts with an ingot and ends with a finished item. You are responsible for procuring an ingot, finding an unused anvil, and so on. But if you don’t find that fun, we have another script named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;smith&lt;/code&gt; that will take care of buying an ingot from an NPC (taking care to use the right verb for each NPC!), search out an unused anvil, and then start crafting.&lt;/p&gt;

&lt;p&gt;The beauty of this system is that scripts are purely additive - they do not take away from the game. They are tools in your toolbox, only doing as much or as little as you want them to. And your need can easily change over time. The first time you craft, you should do it by hand to understand how the process works. The 300th time you make something, you may decide to use a script. And because of the experience and skill model of DR (the topic of a future post), if you want to get good at a craft, you’ll eventually be making that 300th item (or 3000th…).&lt;/p&gt;

&lt;h2 id=&quot;but-you-dont-have-to-take-my-word-for-it&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=vAvQbEeTafk&quot;&gt;But you don’t have to take my word for it&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;I asked some of the folks using our scripts what they thought (names have been removed for privacy):&lt;/p&gt;

&lt;p&gt;Person ‘E’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I use scripts to train, and perform matters of rote for me so that I can spend the time I would normally be available to play as an opportunity to roleplay and interact with others instead of feeling pressured to work on progressing. Without scripting i feel like i have to choose between roleplaying and making progress given the time sink involved. Scripting enables me to enjoy both sides with giving one up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘C’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I find watching my character play the game through logic I’ve written (or some else) is really satisfying. Writing a script to do some complicated task, watching it fail terribly, fixing it and then finally when it works for the first time; it feels like an accomplishment. And less to the point, you have this really nice collaborative project going so we can all share and improve on each others work. Also time is a precious commodity for people, having it spent on braiding grass or really any DR skill training is not adding to my immersion in any game world. I think its interesting the first time, so you see a flavor of how it works, read the text, and form a mental image of what your character is doing… but beyond that its just a waste of time really.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘I’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I agree, I think of DR as the ultimate grind and scripts help with that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘N’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Just wanted to say thanks again for the amazing amount of work you all do on this. It’s changed DR for me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Person ‘V’:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;I would also venture to say that in writing a script you’re taking a deeper look at what you’re doing, which is fun. In writing a script you’re taking the time to think about it and make it efficient. You’re thinking about why you’re responding to things and how you react and why. That’s pretty neat. I wish there was a way to force me into that mental framework in everyday life, I’d probably be a better person lol.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
 </entry>
 
 <entry>
   <title>What We've Got Here is Failure to Authenticate</title>
   <link href="http://www.rpherbig.com/2016/10/22/failure-to-authenticate.html"/>
   <updated>2016-10-22T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2016/10/22/failure-to-authenticate</id>
   <content type="html">&lt;p&gt;In &lt;a href=&quot;/2016/10/11/when-good-ssl-certificates-go-bad.html&quot;&gt;the previous post&lt;/a&gt;, we set up server-side rules to redirect HTTP traffic to HTTPS. Using HTTPS ensures that the client and server are communicating securely and that no one is &lt;a href=&quot;https://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot;&gt;intercepting the traffic&lt;/a&gt;. An example of this redirection is in row 1:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/URL_Redirects.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But there’s still a problem: the browser is making that initial request over HTTP. That request is still vulnerable and a malicious entity could prevent the redirect to HTTPS.&lt;/p&gt;

&lt;h2 id=&quot;hsts-and-you&quot;&gt;HSTS and you&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security&quot;&gt;HTTP Strict Transport Security&lt;/a&gt; (HSTS) is a security policy which indicates that your site should always be accessed over HTTPS. Enabling it means that now your browser won’t make that initial connection over HTTP. Instead it will internally redirect itself to the location from before, which uses HTTPS.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/HSTS_Redirect.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Luckily for us, Cloudflare makes it easy. On the &lt;a href=&quot;https://www.cloudflare.com/a/crypto/&quot;&gt;Crypto configuration page&lt;/a&gt;, there is a HSTS setting. Before you can enable HSTS, there’s a bunch of warning text to read and acknowledge, and for good reason. Since you are telling browsers to always use HTTPS, if HTTPS somehow becomes disabled or invalid on your site, users will not be able to view it. The HSTS setting has a ‘max-age’ which indicates for how long it is applicable. That means your site may be completely inaccessible to users for that long.&lt;/p&gt;

&lt;p&gt;Don’t let the warnings scare you. As long as you’re aware of the implications, HSTS is a good security feature. Test your HTTPS connection thoroughly first. Then when you are confident it is working, set ‘max-age’ to a small value (ideally 1 day or so; but if you’re using Cloudflare you are stuck with 1 month). Continue testing and gradually increase ‘max-age’. Also be aware of &lt;a href=&quot;http://caniuse.com/#feat=stricttransportsecurity&quot;&gt;browser compatibility&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To disable HSTS, carefully reverse the process. Turn off the HSTS policy, but keep supporting HTTPS until ‘max-age’ has elapsed. Then you can disable HTTPS.&lt;/p&gt;

&lt;p&gt;But there’s still a (smaller) problem: HSTS only prevents the browser from making subsequent requests over HTTP. The browser is still making that initial request over HTTP, which is a potential vulnerability.&lt;/p&gt;

&lt;h2 id=&quot;preloading-to-the-rescue&quot;&gt;Preloading to the rescue&lt;/h2&gt;

&lt;p&gt;Many smart people have thought this over and decided that browsers should have a list of sites which support HSTS preloaded when they ship. If you visit a site which is in this list, your browser doesn’t even make that first call over HTTP - it already knows to use HTTPS.&lt;/p&gt;

&lt;p&gt;To submit your site for inclusion in the preload list, you must redirect HTTP traffic to HTTPS and include the HSTS header. The max-age must be at least eighteen weeks, use the includeSubDomains option, and use the preload option. The steps on these two blog posts, plus Cloudflare’s defaults where not specified, meet those requirements. Now it’s just a matter of visiting the Chromium &lt;a href=&quot;https://hstspreload.appspot.com/&quot;&gt;HSTS preload submission app&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>When Good SSL Certificates Go Bad</title>
   <link href="http://www.rpherbig.com/2016/10/11/when-good-ssl-certificates-go-bad.html"/>
   <updated>2016-10-11T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2016/10/11/when-good-ssl-certificates-go-bad</id>
   <content type="html">&lt;p&gt;I recently &lt;a href=&quot;https://www.rpherbig.com/2016/09/30/a-lot-can-happen-in-a-year.html&quot;&gt;wrote a blog post&lt;/a&gt; after a long period of inactivity and I got some feedback. The most common response was “you blog?” - but the second most common response was “hey, &lt;a href=&quot;https://www.youtube.com/watch?v=jG2KMkQLZmI&quot;&gt;your SSL certificate is bad&lt;/a&gt;”. This was rather unexpected since I use GitHub Pages specifically to avoid having to think about that sort of thing.&lt;/p&gt;

&lt;p&gt;Sure enough, when I went to www.rpherbig.com in Chrome I got an Unsafe Site warning:
&lt;img src=&quot;/images/UnsafeSiteWarning.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s no way to greet people visiting my blog. Proceeding to the site gives a bit more information:
&lt;img src=&quot;/images/Broken_HTTPS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It turns out that this is a known problem when using GitHub Pages and a custom domain. In fact, it’s been a problem since at least 2014. I’m not sure how it took me this long to notice, but enough is enough - it’s time to do something about this.&lt;/p&gt;

&lt;h2 id=&quot;you-only-need-one-piece-of-flare&quot;&gt;You only need &lt;a href=&quot;https://www.youtube.com/watch?v=KJtrLKGZZFg&quot;&gt;one piece of flare&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Enter Cloudflare, stage right. Cloudflare’s product sits between the end user (you, reading this blog post) and the content server (in this case, GitHub Pages). Cloudflare offers a &lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;whole lot of services&lt;/a&gt; - among them making it easy to configure SSL (image courtesy of &lt;a href=&quot;https://blog.cloudflare.com/introducing-strict-ssl-protecting-against-a-man-in-the-middle-attack-on-origin-traffic/&quot;&gt;CloudFlare’s blog post on the introduction of strict SSL&lt;/a&gt;):
&lt;img src=&quot;/images/Cloudflare_Full_SSL.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The signup process is painless and straightforward. I won’t detail the steps I took here since I used the defaults. Do note, it took the better part of a day for my SSL certificate to be authorized, and a bit longer yet for the name server (DNS) changes to propagate and take effect. The next day I was back in business:
&lt;img src=&quot;/images/Valid_HTTPS.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;not-so-fast&quot;&gt;Not so fast…&lt;/h2&gt;

&lt;p&gt;All of our hard work only matters if the visitor is using HTTPS, so let’s force its use. GitHub Pages allows you to &lt;a href=&quot;https://help.github.com/articles/securing-your-github-pages-site-with-https/&quot;&gt;enforce HTTPS&lt;/a&gt;, but only if you are using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;github.io&lt;/code&gt; domain.&lt;/p&gt;

&lt;p&gt;For a custom domain, it’s a bit trickier. You will need to create up to three Page Rules in Cloudflare (depending on if you’re using a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;www&lt;/code&gt; subdomain like I am):&lt;/p&gt;

&lt;table border=&quot;1&quot;&gt;
    &lt;tr&gt;
        &lt;th&gt;URL matches&lt;/th&gt;
        &lt;th&gt;Setting&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;http://rpherbig.com/*&lt;/td&gt;
        &lt;td&gt;Always Use HTTPS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;http://www.rpherbig.com/*&lt;/td&gt;
        &lt;td&gt;Always Use HTTPS&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;https://rpherbig.com/*&lt;/td&gt;
        &lt;td&gt;Forwarding URL (301 - Permanent Redirect): https://www.rpherbig.com/$1&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Once you have the Page Rules in place, I highly recommend testing them by visiting each of the URLs to ensure they redirect properly. In this example, you would test http://rpherbig.com, http://www.rpherbig.com, and https://rpherbig.com - and expect them all to redirect to https://www.rpherbig.com.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/URL_Redirects.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here you can see my test for http://rpherbig.com. Cloudflare redirected us to https://rpherbig.com (row 1). Then https://rpherbig.com was redirected to https://www.rpherbig.com (row 2). Then the final URL of https://www.rpherbig.com was loaded (row 3).&lt;/p&gt;

&lt;p&gt;It’s important for the security of your site that these Page Rules be set up correctly so that the redirects happen in the proper order. If https://rpherbig.com redirects to http://www.rpherbig.com, you’re in trouble, even if you eventually end back up on HTTPS.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>A Lot Can Happen in a Year</title>
   <link href="http://www.rpherbig.com/2016/09/30/a-lot-can-happen-in-a-year.html"/>
   <updated>2016-09-30T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2016/09/30/a-lot-can-happen-in-a-year</id>
   <content type="html">&lt;p&gt;One year ago (346 days, but who’s counting?), &lt;a href=&quot;http://rcuhljr.github.io/&quot;&gt;Rob Uhl&lt;/a&gt; introduced me to &lt;a href=&quot;http://www.play.net/dr/&quot;&gt;DragonRealms&lt;/a&gt; (DR), a game he played many years ago. &lt;a href=&quot;https://en.wikipedia.org/wiki/DragonRealms&quot;&gt;DragonRealms&lt;/a&gt; is an online text-based role playing game (RPG), also known as a &lt;a href=&quot;https://en.wikipedia.org/wiki/MUD&quot;&gt;multi-user dungeon&lt;/a&gt; (MUD). MUDs were the precusors to today’s massively multiplayer-online games (MMOs). I played many a MUD back in the day, though not this one, so I was interested. DR used to require a paid subscription to play, but the recently added free to play (F2P) option made the barrier to start playing virtually nonexistent.&lt;/p&gt;

&lt;p&gt;In true RPG fashion, DragonRealms has a very large set of skills that impact your gameplay. But unlike many RPGs, you gain experience and levels for each skill independently, and the experience gain is based on your usage of that skill. Want to get better at swinging a sword? Go swing a sword a lot. But that won’t help you swing a mace or craft some armor.&lt;/p&gt;

&lt;p&gt;It quickly became apparent that some parts of the game were very repetitive. For example, you first have to climb hundreds of trees to train up your Athletics skill before being able to take a shortcut (swimming across a river instead of waiting on a ferry). This is analogous to the ‘treadmill’ effect in many MMOs. Don’t get me wrong - there are many interesting and non-repetitive parts of the game, but in some cases you have to slog through the tedium to get to the good parts.&lt;/p&gt;

&lt;p&gt;Why should you care? Why am I telling you this? Well, like any good software engineers, we saw an opportunity to automate the boring parts. So we set out on a year-long journey (that is still ongoing).&lt;/p&gt;

&lt;p&gt;The default front end had some &lt;a href=&quot;https://www.play.net/playdotnet/play/stormfront_scripting.asp&quot;&gt;basic scripting capabilities&lt;/a&gt;: regex matching, loops, and labels/GOTOs - very BASIC-like. You can imagine how much fun that was to use. Even a basic script like &lt;a href=&quot;https://elanthipedia.play.net/Gem_Seller_(script)&quot;&gt;selling gems&lt;/a&gt; could run over 700 lines. And there’s not really a meaningful way to debug that mess if you make a mistake. It’s the Volkswagen of scripting languages - it’ll get you where you want to go, but it’ll be uncomfortable. That lasted about a week before we started looking for other options. We evaluated several and ended up picking one, &lt;a href=&quot;https://lichproject.org/&quot;&gt;Lich&lt;/a&gt;, and a year later we’ve written 20,000 lines of Ruby.&lt;/p&gt;

&lt;p&gt;“But Herbig, you yada yada’d over the best part!” I hear you say. That’s right - no one writes 20,000 lines of code without some good stories to tell. Rob and I will be writing more posts in the future about some of the interesting things we’ve done for this project.&lt;/p&gt;

&lt;p&gt;In the meantime, I’ll leave you with some numbers, because who doesn’t love numbers?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rpherbig/dr-scripts/commit/1f41330ff94a3220ae80d89f29b91304c1382f80&quot;&gt;First commit&lt;/a&gt;: Oct 16, 2015&lt;/li&gt;
  &lt;li&gt;17 contributors&lt;/li&gt;
  &lt;li&gt;3468 commits&lt;/li&gt;
  &lt;li&gt;705 issues&lt;/li&gt;
  &lt;li&gt;166 closed PRs&lt;/li&gt;
  &lt;li&gt;20,240 lines of Ruby (code)&lt;/li&gt;
  &lt;li&gt;7,941 lines of YAML (configuration and data)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Spoiler alert: it’s pretty awesome.&lt;/p&gt;

&lt;p&gt;GL HF&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Book Review - The Talent Code</title>
   <link href="http://www.rpherbig.com/2015/07/17/the-talent-code.html"/>
   <updated>2015-07-17T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2015/07/17/the-talent-code</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/TheTalentCode.jpg&quot; alt=&quot;&quot; /&gt;
&lt;a href=&quot;http://smile.amazon.com/Talent-Code-Greatness-Born-Grown/dp/055380684X/ref=sr_1_1&quot;&gt;The Talent Code&lt;/a&gt;&lt;br /&gt;
Daniel Coyle&lt;br /&gt;
ISBN-13: 978-0553806847&lt;/p&gt;

&lt;hr /&gt;

&lt;h1 id=&quot;overview&quot;&gt;Overview&lt;/h1&gt;

&lt;p&gt;What is the secret of talent? How do we become great at something?&lt;/p&gt;

&lt;p&gt;Coyle suggests that &lt;a href=&quot;https://en.wikipedia.org/wiki/Myelin&quot;&gt;myelin&lt;/a&gt; is behind it all. Myelin is an insulating material that forms a sheath around nerve fibers in the brain. The stronger the myelin sheath, the better the signal strength, speed, and accuracy of the nerve impulse. This in turn makes physical and mental actions quicker, clearer, and more accurate. This is what we commonly refer to as a talent or skill.&lt;/p&gt;

&lt;p&gt;Now we have a new question to ask: how can we promote myelination? Coyle suggests that there are three components: deep practice, ignition, and master coaching. The book is full of case studies to illustrate how this works, so I’ll give a short description of each part.&lt;/p&gt;

&lt;p&gt;First, it is important to note that practice is not &lt;em&gt;deep practice&lt;/em&gt;. Simply going through the motions of practice won’t cut it - deep practice must be deliberate. This deep practice, as Coyle defines it, requires several things:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;A deep practice session must be &lt;em&gt;focused on learning&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;We must purposefully operate at the &lt;em&gt;edge of your ability&lt;/em&gt;. If we aren’t making mistakes, we won’t learn anything new.&lt;/li&gt;
  &lt;li&gt;We must be able to &lt;em&gt;accurately identify mistakes&lt;/em&gt;. If there is not a clear distinction between success and failure, we can’t tell if new approaches and techniques are working or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we are going to invest enough time and energy to grow our talent, we need to be highly motivated. Building that motiviation is what Coyle refers to as ignition. I call it engagement. I think some might call it passion. Whatever the name, we must be interested and invested in learning.&lt;/p&gt;

&lt;p&gt;Master coaching is the concept of a third party that assists in the learning process. The coach does not need to already be an expert in the skill that is being learned, though it helps. Rather, the coach is there to facilitate deep practice sessions and sustain ignition (such as with encouragement and motivation).&lt;/p&gt;

&lt;h1 id=&quot;takeaways&quot;&gt;Takeaways&lt;/h1&gt;

&lt;p&gt;Ignition and deep practice can be mostly driven by the individual. Finding a master coach seems more difficult.&lt;/p&gt;

&lt;p&gt;The best coaches/mentors don’t need to be Great Leaders, they need to listen and observe. It is not inspiring speeches that build talent, it is small, targeted, highly specific suggestions. It is not pep talks, but rather customizing a message to the personality of the student.&lt;/p&gt;

&lt;p&gt;Break everything down into its component pieces. Actions, thoughts, movements, bars of music. Small components make it easy to focus on repetition and quick iterations, which are key. We need fast feedback on failure. That sounds familiar - where have I heard that before?&lt;/p&gt;

&lt;p&gt;Myelination is one-way (wraps, it does not unwrap), barring disease, injury, or age. This explains hard-to-break habits - it is easier for impulses to fire for well-established bad habits than new good habits. We must keep going until the pathway for the good habit is stronger.&lt;/p&gt;

&lt;p&gt;When praising others, do not praise smarts. This leads to an emphasis on &lt;em&gt;appearing&lt;/em&gt; smart, which encourages low risk-taking behaviors. If the person is not taking risks, they are not operating at the edge of their skill, which slows progress and learning.&lt;/p&gt;

&lt;h1 id=&quot;questions&quot;&gt;Questions&lt;/h1&gt;

&lt;p&gt;How can we sustain ignition?&lt;/p&gt;

&lt;p&gt;How can we become master coaches?&lt;/p&gt;

&lt;p&gt;Can we get into “deep practice” mode at work? That is, can work be treated as practice?&lt;/p&gt;

&lt;p&gt;How do we train “slow” or “low feedback” skills? A few examples that came to mind would be architecture and estimation.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Book Review - The Wisdom of Crowds</title>
   <link href="http://www.rpherbig.com/2015/01/28/the-wisdom-of-crowds.html"/>
   <updated>2015-01-28T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2015/01/28/the-wisdom-of-crowds</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/TheWisdomOfCrowds.jpg&quot; alt=&quot;&quot; /&gt;
&lt;a href=&quot;http://smile.amazon.com/Wisdom-Crowds-James-Surowiecki/dp/0385721706/ref=sr_1_1&quot;&gt;The Wisdom of Crowds&lt;/a&gt;&lt;br /&gt;
James Surowiecki&lt;br /&gt;
ISBN-13: 978-0385721707&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;This book is in two parts. The first part explains Surowiecki’s theory of the wisdom of crowds: under the right circumstances, groups are remarkbly intelligent, and are often smarter than the smartest people in them. This can happen (so the theory goes) even if most of the people within a group are not especially well-informed or rational.&lt;/p&gt;

&lt;p&gt;Think about that for a moment… A group of laymen can outperform experts. It seems so counterintuitive. What kind of a game changer would it be if it were true? (That’s rhetorical, but you can still send me your thoughts!)&lt;/p&gt;

&lt;p&gt;The second part of the book consists of case studies. These are situations in which a crowd, which may consist of non-experts or include a small percentage of experts, outperform the experts alone. There are many case studies provided, most of which are rather interesting.&lt;/p&gt;

&lt;h1 id=&quot;are-crowds-actually-wise&quot;&gt;Are crowds actually wise?&lt;/h1&gt;

&lt;p&gt;Maybe.&lt;/p&gt;

&lt;p&gt;Surowiecki does a great job explaining his theory. His writing and approach makes it very accessible to a wide audience. He provides a lot of case studies - around half the book!&lt;/p&gt;

&lt;p&gt;But I’m still not convinced of the efficacy of the wisdom of crowds. The case studies in the book seem cherry-picked to support the theory. A reviewer on Amazon pointed out that the world of Wall Street provides plenty of negative examples to counterbalance the positive examples in the book.&lt;/p&gt;

&lt;h1 id=&quot;if-so-under-what-conditions&quot;&gt;If so, under what conditions?&lt;/h1&gt;

&lt;p&gt;The author proposes that most problems fall into one of three categories: cognition (something with one or more correct answers), coordination (characterized by a systemic solution), and cooperation (get self-interested and distrustful actors to achieve a common goal).&lt;/p&gt;

&lt;p&gt;The book claims that for a crowd to be wise, it needs diversity, independence, decentralization, and aggregation. The first three are pretty clearly explained in the book, but the fourth is left rather vague. The book says to design the aggregation mechanism such that errors or incorrect answers distribute evenly (i.e. cancel out) and correct answers aggregate. That makes sense, but it’s not exactly practical advice - the book doesn’t really explain how to do this.&lt;/p&gt;

&lt;p&gt;I think the theory is promising, but I have my reservations: the restrictions on the problem space, the difficulty of determining who makes up the crowd, and the complexity of aggregating the crowd’s solutions. I’m not the only one with these concerns: for more reading, check out &lt;a href=&quot;http://en.wikipedia.org/wiki/Wisdom_of_the_crowd#Problems&quot;&gt;this link&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Wisdom_of_Crowds#Criticism&quot;&gt;this one&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Book Review - Waltzing With Bears</title>
   <link href="http://www.rpherbig.com/2015/01/27/waltzing-with-bears.html"/>
   <updated>2015-01-27T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2015/01/27/waltzing-with-bears</id>
   <content type="html">&lt;p&gt;&lt;img src=&quot;/images/WaltzingWithBears.jpg&quot; alt=&quot;&quot; /&gt;
&lt;a href=&quot;http://smile.amazon.com/Waltzing-Bears-Managing-Software-Projects/dp/0932633609/ref=sr_1_2&quot;&gt;Waltzing With Bears: Managing Risk on Software Projects&lt;/a&gt;&lt;br /&gt;
Tom DeMarco and Timothy Lister&lt;br /&gt;
ISBN-13: 978-0932633606&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;You’ve probably heard of this book, even if you haven’t read it. You’re probably already familiar with a lot of the ideas in this book, even if you haven’t read it. That’s because a lot of the advice in this book has become best practice for risk management.&lt;/p&gt;

&lt;p&gt;DeMarco and Lister devote several chapters to convincing you that risk is bad and managing it is good (i.e. will help lead to a successful outcome). I was surprised that they spent so long on what I thought was obvious, but they point out how common ignoring risk is in our field. No one wants to give or receive bad news, and in some corporate cultures it’s not even possible without repercussions.&lt;/p&gt;

&lt;p&gt;A good point that the authors spend quite a while on is that a delivery date should not consist of a single date, but rather a probability distribution. This date is at 50% confidence, this date is 80%, and so on. You can treat risk the same way; for example: this risk has a 50% chance of occurring and will have an impact of 2 weeks if it materializes. The book gives some specific examples how to determine reasonable curves for various parts of a project (risk included), and then how to combine curves into the probability for the delivery of the project as a whole.&lt;/p&gt;

&lt;p&gt;That is all predicated on the ability to quantify risk and how it will impact the project, and the book offers guidance on how to do this. It also acknowledges that sometimes a company’s culture will prevent the application of these techniques. You have to make do with what you have.&lt;/p&gt;

&lt;p&gt;Following from all of this is the interesting idea that you can express commitments as probability distributions. You can then help your stakeholders understand the most likely outcomes of the project, as well as what factors influence those outcomes.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GitHub Pages and Jekyll and Windows, Oh My!</title>
   <link href="http://www.rpherbig.com/2014/11/29/github-pages-and-jekyll-and-windows.html"/>
   <updated>2014-11-29T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2014/11/29/github-pages-and-jekyll-and-windows</id>
   <content type="html">&lt;p&gt;You may have heard of a small company based out of Albuquerque: Micro-Soft. Don’t feel bad if you haven’t, they’re a pretty small company (but keep an eye on them, I hear they’re going to have a huge IPO in ‘86). Because they’re such a small player in the market, Jekyll doesn’t officially support their operating system. However, Jekyll has endorsed a guide by &lt;a href=&quot;https://twitter.com/juthilo&quot;&gt;@juthilo&lt;/a&gt; that “&lt;a href=&quot;http://jekyll-windows.juthilo.com/&quot;&gt;seems to work for most&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;Don’t get too excited though, because if you followed my advice and used GitHub Pages, that link is just a red herring (much like Communism, &lt;a href=&quot;http://www.imdb.com/title/tt0088930/quotes&quot;&gt;according to Wadsworth&lt;/a&gt;). What follows is cherry-picking parts of several guides to get it all working.&lt;/p&gt;

&lt;h2 id=&quot;the-setup&quot;&gt;The Setup&lt;/h2&gt;

&lt;p&gt;The zeroth thing you’ll need to do is &lt;a href=&quot;/2014/11/23/github-pages-and-you.html&quot;&gt;setup your GitHub Pages repository&lt;/a&gt; and clone it locally (left as an exercise to the reader).&lt;/p&gt;

&lt;p&gt;The first thing you’ll need to do is install Ruby. Follow the instructions on only &lt;a href=&quot;http://jekyll-windows.juthilo.com/1-ruby-and-devkit/&quot;&gt;page one&lt;/a&gt; of juthilo’s guide, then return here.&lt;/p&gt;

&lt;p&gt;Second, we’re going to install Jekyll, but we’re going to do so in a way that is compatible with Pages. Create a file in your repo named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; and put the following in it:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;https://rubygems.org&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;github-pages&apos;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;gem&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;wdm&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;&amp;gt;= 0.1.0&apos;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Gem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;win_platform?&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Now open a command prompt (I suggest GitBash), navigate to your repo, and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem install bundler&lt;/code&gt;, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;. This will take a little while, but it ensures that we are only using gems allowed by Pages (one of which is Jekyll itself) and the appropriate versions thereof. GitHub is very restrictive as to what gems you can use with Pages, and rightfully so since the code will be running on their servers.&lt;/p&gt;

&lt;p&gt;Now run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll new .&lt;/code&gt; to create your site with a bunch of defaults. You can now build your site locally before publishing by running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll serve&lt;/code&gt; and opening &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;http://localhost:4000&lt;/code&gt; in a browser. By using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;serve&lt;/code&gt;, changes to files will be updated immediately - just refresh the page. You can push a changeset to GitHub when you are happy with the result and it will be published to your site.&lt;/p&gt;

&lt;p&gt;Technically, you can stop now. You have the tools to manage your blog. However, if you want to use syntax highlighting there’s one more hoop to jump through. Otherwise you can skip the next section.&lt;/p&gt;

&lt;h2 id=&quot;syntax-highlighting&quot;&gt;Syntax Highlighting&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://jekyll-windows.juthilo.com/3-syntax-highlighting/&quot;&gt;Page three&lt;/a&gt; of juthilo’s guide has a nice comparison of two popular syntax highlighters (Pygments and Rouge). However, Pages does not support Rouge, so the decision is made for us.&lt;/p&gt;

&lt;p&gt;Go ahead and follow the instructions on only &lt;a href=&quot;http://jekyll-windows.juthilo.com/3-syntax-highlighting/&quot;&gt;page three&lt;/a&gt; of juthilo’s guide, choosing Pygments and skipping Rouge.&lt;/p&gt;

&lt;p&gt;If you accidentally set your highlighter to Rouge, you’ll get an email from GitHub saying that deployment of your site failed, but with an empty error message (needless to say, it took me a while to figure that one out).&lt;/p&gt;

&lt;h2 id=&quot;start-using-jekyll&quot;&gt;Start using Jekyll&lt;/h2&gt;

&lt;p&gt;Here are some of the more interesting files/directories in your repo right now:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts/&lt;/code&gt; contains your posts. By default it has one named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Welcome to Jekyll&lt;/code&gt; that you may or may not want to keep.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site/&lt;/code&gt; contains the static HTML for your site, if you built it locally by running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jekyll build&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; specifies files that Git should ignore. You should add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_site&lt;/code&gt; to it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; stores, you guessed it, configuration. You should update the placeholders with something more useful.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;about.md&lt;/code&gt; is your “About” page. You should update it with something more useful.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;README.md&lt;/code&gt; was created when you made the repo on GitHub, and has nothing to do with Jekyll. It is only visible when someone browses GitHub, not your site. Nonetheless, you should update it.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;More information can be found on the &lt;a href=&quot;http://jekyllrb.com/docs/structure/&quot;&gt;official Jekyll site&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To publish a new post, simply create a files in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_posts/&lt;/code&gt;. Files in this directory must be named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YEAR-MONTH-DAY-title.extension&lt;/code&gt;, where extension is either of the two supported formats (&lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;.markdown&lt;/a&gt; or &lt;a href=&quot;http://redcloth.org/textile&quot;&gt;.textile&lt;/a&gt;). More information can be found on the &lt;a href=&quot;http://jekyllrb.com/docs/posts/&quot;&gt;official Jekyll site&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;drafts&quot;&gt;Drafts&lt;/h2&gt;

&lt;p&gt;If you’re like me and have multiple machines, you may be interested in the “drafts” functionality offered by Jekyll (drafts are simply unpublished posts).&lt;/p&gt;

&lt;p&gt;Create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_drafts/&lt;/code&gt; directory and commit your works-in-progress to it. These files will not be shown on your site, but you can now leverage the power of git while you work on your future posts.&lt;/p&gt;

&lt;p&gt;You can preview your drafts locally by adding the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--drafts&lt;/code&gt; switch when you build or serve Jekyll. Drafts will then show up as if they were published posts. This switch is local only - it does not affect how your site will deploy to Pages.&lt;/p&gt;

&lt;p&gt;To publish a draft, simply run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;git mv _drafts/title.extension _posts/YEAR-MONTH-DAY-title.extension&lt;/code&gt; and commit/push. Adding the date to the file’s new name is mandatory.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next?&lt;/h2&gt;

&lt;p&gt;This was the easy part. Now you need to fill your blog with content!&lt;/p&gt;

&lt;p&gt;But as for your site, there’s a lot you can do. One of my coworkers started tracking his &lt;a href=&quot;http://mike-rogers.github.io/pages/pdu.html&quot;&gt;professional development projects&lt;/a&gt;. Another wrote a &lt;a href=&quot;http://jekyllthemes.org/themes/lagom/&quot;&gt;neat Jekyll theme&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As for me, I’m not sure what I’ll do next. Off the top of my head, I want to look into a few things: custom domains, analytics, and RSS vs Atom. But I make no promises as to where the Muses take me next. If you have a suggestion or request, feel free to drop me a line (check the footer for my contact info).&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>GitHub Pages and You</title>
   <link href="http://www.rpherbig.com/2014/11/23/github-pages-and-you.html"/>
   <updated>2014-11-23T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2014/11/23/github-pages-and-you</id>
   <content type="html">&lt;p&gt;Blogging should be about the writing, not the mechanism for displaying text. For this grand experiment, the first step is just to get some text served up in the easiest way possible (agile blog design, if you will).&lt;/p&gt;

&lt;p&gt;Let’s avoid as much work as possible: no custom domain, no hosting, no database, no theming. How could we possibly get away with that? Hint: it’s in the title.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;What is GitHub Pages? If you create a repo with a specific name (username.github.io), the content will be automatically served up at http://username.github.io. It’s the kind of URL you don’t take home to mother, but it’ll work (remember, the emphasis is on the writing). And with GitHub taking care of all the hosting headaches, it’s worth it.&lt;/p&gt;

&lt;p&gt;GitHub’s &lt;a href=&quot;https://pages.github.com/&quot;&gt;own site&lt;/a&gt; does a good job of explaining it in detail. By the end of their instructions, you will have an externally accessible site and a static index.html page. Pushing to the repo’s master branch will automatically update the served content.&lt;/p&gt;

&lt;p&gt;Now what? Where to go from here? The end of the GitHub Pages tutorial offers some suggestions: use Jekyll to start a blog, set up a custom URL, or set up some more advanced features like a custom 404.&lt;/p&gt;

&lt;p&gt;Since we’re going for simplicity, let’s start with turning that static index.html into something a bit more useful. Jekyll is a static website generator that was recommended to me, and in turn I recommend it to you.&lt;/p&gt;

&lt;p&gt;GitHub Pages and Jekyll were designed to work together. It’s &lt;a href=&quot;https://help.github.com/articles/using-jekyll-with-pages/&quot;&gt;smooth sailing ahead&lt;/a&gt; as long as you aren’t using Windows. If you are, batten down the hatches and hang on. I’ll be writing soon about the edge case that is Windows soon.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Hello world</title>
   <link href="http://www.rpherbig.com/2014/11/16/hello-world.html"/>
   <updated>2014-11-16T00:00:00+00:00</updated>
   <id>http://www.rpherbig.com/2014/11/16/hello-world</id>
   <content type="html">&lt;p&gt;A wild blog has appeared!&lt;/p&gt;

&lt;p&gt;I’ve considered blogging for a while now, but somehow I never quite got around to it. I recently felt particularly motivated, so I sat down to start writing.&lt;/p&gt;

&lt;p&gt;And promptly stopped. I had no idea what to write about. I decided to take a quick detour and get a blog up and running. It would buy me time to think of something brilliant to write. How hard could it be to set up a simple blog?&lt;/p&gt;

&lt;p&gt;Let’s start with a popular blogging tool, Jekyll. Mix in an easy hosting platform like GitHub Pages. Sprinkle in a dash of Google Domains for a personalized domain. I’ll do my writing on my laptop, a Windows machine, and run Jekyll locally before publishing.&lt;/p&gt;

&lt;p&gt;Spoiler alert: it didn’t go as smoothly as I expected.&lt;/p&gt;

&lt;p&gt;What was supposed to be a nice leisurely exercise in procrastination turned into actual effort and my first few posts. It’s funny how things work out.&lt;/p&gt;
</content>
 </entry>
 
 
</feed>
