<rss version="2.0"><channel><title>Danielbeck.net</title><link>//danielbeck.net</link><description>Your source for all things Daniel and Beck</description><item><pubDate>Sun, 29 Mar 2026 13:59:42 GMT</pubDate><title>Rifling through thirty years of broken process looking for something salvageable</title><link>//danielbeck.net/archive/rifling-through-thirty-years-of-broken-process-looking-for-something-salvageable.html</link><guid>//danielbeck.net/archive/rifling-through-thirty-years-of-broken-process-looking-for-something-salvageable.html</guid><description><![CDATA[<p>I just fed this site through <a href="https://replacebyclawd.com/">https://replacebyclawd.com/</a> and have never felt more seen.  Here’s how it summarizes me:</p>
<blockquote>
<p>I’m a UX/IA designer turned frontend developer turned engineering manager, which is a very efficient way to spend a career moving steadily closer to the meetings. I’ve been working on the web since the era when ugly was a technical limitation instead of a brand choice. I like messy situations: products that need rethinking, teams that need structure, organizations pretending uncertainty is a temporary bug. I’m good at making systems — product systems, design systems, team systems — less chaotic and slightly less insulting to the people using them. I also maintain a personal website in the year 2026, so obviously I have accepted that I am a type. I take photos of giant roadside objects, paint despite evidence, and keep writing on a blog like social media was an unfortunate side quest. It’s not nostalgia so much as a refusal to die in an app.</p>
</blockquote>
<ul>
<li>I have spent an unreasonable amount of my life translating between designers, developers, and managers who are all technically using English.</li>
<li>I keep ending up in transitional moments: reorgs, greenfield efforts, legacy overhauls, startups trying to put on adult clothes.</li>
<li>I crossed from design into engineering and then into management, which means I now understand exactly how every function disappoints the others.</li>
<li>I have probably sent some version of ‘please include an agenda’ in more organizations than is medically ideal.</li>
<li><strong>Creature:</strong> graybeard web raccoon with one paw in IA, one in frontend, and the rest of him rifling through thirty years of broken process looking for something salvageable</li>
<li><strong>Vibe:</strong> Like if your most competent engineering manager was raised by the 1990s web, survived freelance client madness, and now turns up at dinner muttering about developer workflows, bad meeting invites, and the strange dignity of still owning a personal website. Strong ‘I have seen three generations reinvent the same mess with worse typography’ energy.</li>
<li><strong>Emoji:</strong> 🦝</li>
</ul>

Yeah.  Freakin’ nailed it.   Next time I need to rewrite my resume, I know where to go for copy edits]]></description></item><item><pubDate>Sat, 17 Jan 2026 13:17:35 GMT</pubDate><title>Predictions about AI (I’m really bad at predictions)</title><link>//danielbeck.net/archive/bad-predictions-about-ai.html</link><guid>//danielbeck.net/archive/bad-predictions-about-ai.html</guid><description><![CDATA[<p>I’ve been tidying up around here lately — as one does every few years when one maintains a long-lived, little-trafficked blog mostly out of a guilty sense of obligation <footnote>I already feel bad enough about breaking the “URLs should be permanent” rule, but the name scheme I settled on years ago was too dumb to keep</footnote> — and looking at some of my older tech posts, I’ve made some <em>really</em> bad predictions.  I think the worst one was that JSON would never displace XML as the structured data format of choice. <footnote>(“But it has no namespaces! And attributes and child nodes might collide!”)</footnote></p>
<p>So here I am to make some more predictions; we can check back in a few years to see how wrong I am.</p>

<h3>AI is useful for production code</h3>

<p>I’m starting with an easy one that’s already (relatively) uncontroversial.  But six months ago I’d have made the opposite prediction here.  So see, I’m already ahead of the game!  </p>
<p>Early models produced garbage, to be sure; and even some current agentic models (GPT-4 and below for example) tend to incidentally break more functionality than they introduce.  But I’ve successfully used both Claude Sonnet and whatever model backs Rovo to:</p>
<ul>
<li><p>perform a major refactor and redesign of a large, complex application feature, by basically prompting “Here’s the old version, here are the characteristics of the new version, good luck” and then iterating a bit on the UI.   All this in a framework I’m basically a novice in (Angular).</p>
</li>
<li><p>search for and extract data from a scattered collection of human-structured (i.e. inconsistently-formatted) Confluence documents</p>
</li>
<li><p>analyze a very noisy date-and-value sequence — ok, yes, my scores in an idle game — by basically prompting it “Here’s some data, what can you tell me about it?”  It was able to detect exponential growth, decided to calculate a moving average to smooth out the noise, made accurate predictions about future trends, and even correctly identified the inflection point at which the rate of growth changed. (Which was the date of an in-app purchase). All without hand-holding on my part; I don’t have the statistical knowledge to do so even if I’d wanted to.</p>
</li>
</ul>
<p>I’m not going to make any guesses about to what degree what we’re calling AI actually lives up to that acronym.  But in practice this is functionally well beyond “predict the next token.”</p>

<h3>The job of “software developer” will soon more closely resemble that of a tech-oriented manager</h3>

<p>Working with an AI agent feels a lot like working with a very eager junior developer. They make similar types of mistakes: the main complaint from skeptics these days is that they can produce unmaintainable spaghetti code if not closely supervised.  Well, guess who else does that?</p>
<p>They work best when they have clear instructions and the full context.  Just like a real developer. Constructing a good prompt feels an awful lot like writing a good JIRA ticket.  (I wouldn’t be at all surprised if someone’s already working on building a direct JIRA-to-code pipeline, except that most JIRA tickets aren’t that well-written or clear.)</p>
<p>They have their own personalities.  Claude is a flatterer, constantly congratulating you on how good your suggestions are.  Gemini is chatty as hell (which they’ve obviously tried and failed to rein in; the chain-of-thought pre-response is littered with the phrase “I need to be concise, so...”).  GPT models are terse and sometimes pretend their mistakes didn’t happen, which they have in common with a subset of human engineers.  (I’m really not impressed with GPT, if that wasn’t clear.)</p>
<p>They perform better if you’re nice to them.   Seriously, I really believe they do; I don’t think I’m just anthropomorphizing here. When I’ve gotten frustrated with the AI making mistakes and started SHOUTING or being sarcastic, I’ve seen the chain-of-thought include “Based on the user’s tone, I need to...” and start outputting noticeably inferior results.    I’ve even see people theorize that they have moods, or <a href="https://news.ycombinator.com/item?id=46648900">perform differently at different times of day</a>; though this one I suspect <em>is</em> anthropomorphism, or else the AI vendors quietly swapping in cheaper models at peak hours.</p>
<p>All of them do, sometimes, create redundant functions or construct difficult-to-understand complex objects; the code they produce isn’t always clear and maintainable.  They sometimes go down rabbit holes and get stuck on the wrong approach or code themselves in circles.
</p><p>
Again, just like a junior engineer.  </p>
<p>(I’ve found it’s best to let them write a rough first draft of whatever feature I’m asking them to implement, then switch to a different chat context and ask for a code review and refactor.   So, yes, you do need to watch their output closely, have enough tech experience to be able to distinguish good code from bad, and to ask for improvements when necessary — true unskilled “vibe coding” isn’t really enough.  Yet.)</p>
<p>So the upshot of coding with AI is that you no longer need to have a grasp on the syntax or low-level details, the agents can take care of that; but you do need to do careful code reviews, understand what you’re looking at, and ask for improvements where necessary.</p>
<p>This feels very similar to the technical aspects of managing software engineers.</p>
<h3>We’ll be stuck with current frameworks forever</h3>
<p>AI agents work best when working in a familiar context, because they have a large corpus of existing code to draw from.  I’ve found that they’re substantially more productive when working in a React, Angular, or Vue context than in vanilla or custom-rolled code.  (I’m mostly a front-end guy, so I’m not as able to evaluate whether this applies to back-end code as well, but I expect it does).</p>
<p>Because we no longer have to pay as much attention to the fine syntax and structural details, there’s little incentive to write a substantially new framework in the age of AI — or at least for a newly-created one to grow large and successful enough for there to be enough human-generated code in it for an AI to train on and become expert in.</p>
<p>So what we have now — React, Vue, Angular, webpack, babel, etc — is going to be with us for a very very long time.  They’ll get incremental updates, sure, but I wouldn’t expect a paradigm shift in code structure anytime soon.</p>
<h3>The disposable front end (and maybe backend too)</h3>

<p>Rewrites and refactors are ridiculously easy now.  There’s no clearer prompt for an agent than an existing codebase, and agents are <em>far</em> better at remembering long lists of edge cases and workarounds than humans are.</p>
<p>I think the age-old wisdom of “<a href="https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/">never do a full rewrite</a>” is approaching its end.  Because the hard part of a rewrite is reading and understanding the existing code — which you <em>no longer need to do</em>.   I’m already looking at some of my older projects and realizing that it’d probably be easier to start from scratch than to update and refactor what already exists.  And I’m less concerned about losing the bugfixes and improvements that will have collected over time, because the AI is good at retaining those in the rewrite.</p>
<p>I think this works because I’ve done it already.  My team was falling behind on a major-version refactor of wildly-outdated legacy code, so I rolled up my sleeves and claimed one of the features for myself. Put the old version in one folder, started fresh in a new folder, added a feature flag to toggle between them, and over the course of a couple weeks Claude and I reproduced all the functionality with modern code patterns and the new workflow.  Would’ve taken me three months if I’d done it by hand, conservatively, because I’d have had to learn the framework first.</p>
<p>It passes all the tests, was accepted as maintainable by human code reviewers, and the only bug reports it’s garnered since it went live are actually feature requests.  (Well, ok, there was one bug, but it was my fault; I didn’t catch a duplicated line of text.  That’s it, seriously.)</p>
<p>The main concern with AI-generated code is that it’ll be difficult for humans to understand and maintain... but maybe that doesn’t matter anymore.  This is the prediction where I may be furthest out on a limb, but I think it’s at least possible that “throw it all out and start over” will be a valid pattern for major-version updates.</p>

<h3>Turmoil and chaos while we figure this stuff out</h3>
<p>Job losses will be incalculable.  It’ll be much more difficult to break into the industry, there’ll be a shortage of actual junior engineers before too long. It’ll resemble the offshoring movement but this time without the cultural or timezone barriers — and much less expensive; going flat out with the most expensive models I’m only able to spend about eight dollars a day on tokens. No human can compete with that.</p>

<p>As the current crop age out to retirement there’ll suddenly be a shortage of skilled seniors capable of supervising the AI output.  (It’ll be a race to see whether the AIs can get to the point where they need as much skilled supervision before that happens.  If it doesn’t, we may see a rehash of the COBOL experts coming out of retirement for Y2K, except this time it’ll be for everything.   If it does, software engineering will become a niche or academic activity <footnote>Someone still needs to build and train the models, and invent new algorithms and approaches, but those people are already a tiny segment of the current industry.</footnote> and the product teams will take over directly for most software.)</p>

<p>Competition will be faster and fiercer. It’ll be much easier to quickly replicate a competitor’s feature set; if someone comes up with a great new idea everyone else will have it production within weeks.  Market success will come more from marketing, branding, ease of use, and patent law, than from the feature list.  Startups will therefore have a much harder go of things; large established companies will have the branding, and can afford the marketing and patent lawyers. There’ll be less incentive for acquisitions.  Good UX may be the only way true startups have left to compete.</p>
<p>It’s going to kind of suck for almost everyone, honestly.  As exciting and productivity-enhancing this stuff is on an individual level, I’m kind of relieved I’m closer to the end of my career path than the beginning.  I don’t envy people graduating from bootcamps or their CS degrees this year.</p>
]]></description></item><item><pubDate>Wed, 14 Jan 2026 19:39:30 GMT</pubDate><title>What does it mean to be an engineering leader?</title><link>//danielbeck.net/archive/what-does-it-mean-to-be-an-engineering-leader.html</link><guid>//danielbeck.net/archive/what-does-it-mean-to-be-an-engineering-leader.html</guid><description><![CDATA[<p>As an engineering leader, you have an important role to play in the growth of people, products, and the organization.</p>

<p>Your job is&nbsp;not to manage people,&nbsp;but to&nbsp;manage <i>processes</i>&nbsp;and&nbsp;<i>lead</i> people.</p>

<p>You manage processes on how you expect work to be done, where each person's responsibilities start and end, how their careers are made, and how all this can be discussed, and/or changed.</p>

<p>You lead people by example and through empathy. They have goals, fears, motivations, and lives outside of work. Act as you would want them to act if the roles were reversed.</p>

<h3>Working with your engineers</h3>
<h4>Align on “why”.</h4>

<p>As engineers, we tend to focus on the “how” – the implementation details, the technical solutions – but it’s equally important that your team members understand why they’re building what they’re building. Ensure they have a clear picture of how their development work fits into the rest of the platform and the organizational strategy; understanding the “why” leads directly to better decision-making and more thoughtful solutions.
Assume (and encourage) positive intent.</p>

<p>Trust, collaboration, and psychological safety are essential for innovation and problem-solving. When team members believe their colleagues are acting with good intentions, it reduces misunderstandings, minimizes conflict, and encourages open communication. Ensure you and your team focus on solutions rather than assigning blame, and create an environment where constructive feedback is embraced.</p>

<h4>Give (and receive) timely, candid feedback.</h4>

<p>Honest feedback allows individuals to identify blind spots, refine their skills, and align their efforts with team goals. It fosters accountability and ensures that issues are addressed promptly, preventing small problems from escalating into larger ones. Leaders who encourage a culture of candid feedback create an environment of mutual trust, where team members feel empowered to share insights and challenge ideas, driving innovation and excellence. Meet regularly with your engineers, both as a group and in individual 1:1s, to create consistent opportunities for open dialogue. Set clear expectations, and expect the same from your team.</p>

<h4>Create a safe environment.</h4>

<p>Treat failures as learning opportunities rather than occasions for blame. Team members are more likely to share concerns or report issues early when they know they won’t face punishment for doing so. Encourage team members to suggest new ideas or alternative approaches without fear of judgment. Run blameless postmortems and retrospectives to analyze challenges objectively, focusing on systemic improvements rather than individual fault.</p>

<h4>Create a productive environment.</h4>

<p>Equip the team with the best tools and resources to succeed, while shielding them from organizational distractions and unnecessary politics. Put performance over presence, and quality over quantity, to ensure that efforts are impactful rather than merely visible. Minimize interruptions, and be mindful of timezones and external obligations when scheduling meetings. Encourage team members to actively participate in conversations. Work with engineers to define a viable career path and&nbsp;create opportunities&nbsp;for learning and advancement, and periodically look at your team to make sure we have the right people in the right roles.</p>

<h4>Encourage continual improvement.</h4>

<p>Technical debt is inevitable: requirements and business needs change, legacy code ages, and bugs are patched quickly and not always cleanly. Encourage developers to improve the application while working on their projects. Turn copypasta into reusable objects, and break up large objects that are difficult to maintain and reason about. Improve the database schema even if it hurts in the short term. Delete old and unused code. Recognize when a codebase has exceeded its useful lifespan and move to replace it with something better.</p>

<p>Fixing tech debt isn’t a standalone project – if you treat it as such you’ll eventually find a reason to abandon it entirely because it’s impacting deadlines. It should be something engineers do all the time during their normal development activities.</p>

<h3>Working with the organization</h3>
<h4>Share your team’s solutions and practices.</h4>
<p>Make sure other teams know what your team is working on to avoid duplicated effort. Sharing solutions doesn’t just save time; it can spark new ideas. Sprint demos are a great starting point for showcasing your work, but look for other ways to connect, like cross-team meetings, shared documentation, or informal discussions, to ensure everyone is aligned.</p>

<h4>Understand solutions built by other teams.</h4>
<p>Stay informed about what other teams are building and how their work might complement your own. Whether it’s tools, processes, or features, leveraging their solutions can save time and resources while strengthening collaboration across the organization. The more you understand what’s happening across teams, the better positioned you’ll be to avoid duplication and maximize efficiency.</p>

<h4>Share your perspective with your team’s leadership group.</h4>
<p>Your technical expertise offers valuable insights. Share your perspective with your team’s product, project, and program managers to highlight low-hanging technical opportunities they might not be aware of. Similarly, they may have product or roadmap knowledge that can help inform your own decision-making.</p>

<h4>Working with your upstream management</h4>
<p>Ensure management understands the value of the software the team creates. This includes demonstrating team's work and showing incremental improvements. Ensure your team’s efforts support organizational goals (and work with your leadership to understand those goals). Regularly communicate the team’s achievements in terms of business value, such as increased efficiency, enhanced user experience, or revenue growth, to bridge the gap between technical efforts and strategic goals.</p>

<h4>Challenge the status quo.</h4>
<p>Always be on the lookout for ways to make things better – whether it’s improving workflows, upgrading tools, or cutting down on inefficiencies. Keep an eye on infrastructure costs and find smarter ways to spend without sacrificing performance. Pay attention to what’s slowing engineers down, and look for ways fix those pain points.</p>

<h3>Working with your customers (internal and external)</h3>
<h4>Bring customer feedback to the team.</h4>
<p>Every bug ticket or feature request is a chance to refine your product and better meet user needs. Share this feedback with your team to help them understand the real-world impact of their work and prioritize fixes or enhancements that matter most.</p>
<h4>Ensure top-level support and uptime.</h4>
<p>Keeping our products reliable and running smoothly is non-negotiable. Take charge of observability to monitor performance, detect issues early, and respond quickly when problems arise. Own the process of software upgrades to ensure your applications are always operating on stable, supported versions.</p>

<h4>Build tools for internal customers.</h4>
<p>Empower your internal teams by creating tools that make their jobs easier and more effective. Whether it’s analytics platforms, dashboards, or customer support tooling, these resources help teams make informed decisions, streamline workflows, and provide better service, which ultimately drives the success of the entire organization.</p>

<h3>Understanding success as an engineering lead</h3>

<p>An engineering lead's success can be measured by their agreement with the following statements:</p>

<ul>
<li>I and my team understand what we’re building, and why it matters to the customer and to the organization.</li>

<li>We understand how our projects mesh with other teams' work, and how they fit into the organization’s overall goals and strategy.</li>

<li>My team members volunteer new ideas and suggest alternative approaches to their tasks. I help my team make decisions; I don’t make decisions for them.</li>

<li>My team is reliably able to predict the duration and complexity of a given task. We understand the requirements clearly before we start building. We routinely meet our sprint commitments and neither over- nor under-commit.</li>

<li>Our code is readable, stable, and maintainable. Everyone on the team has the ability to recognize what mediocre, bad, or excellent work looks like. We take ownership of, and pride in, our work.</li>

<li>When something goes wrong, I learn about it quickly – whether via observability tooling or by a team member raising the issue before it gets that far.</li>

<li>We are able to remedy problems without panic or excessive disruption. We work to ensure that the same problem will not occur again.</li>

<li>I understand each of my team members' strengths; their weaknesses; and their career goals. I’m also aware of my own strengths and weaknesses, and help my team in ways that play to my strengths.</li>
</ul>
]]></description></item><item><pubDate>Fri, 31 Jan 2025 15:31:49 GMT</pubDate><title>Yeah gonna skip that one</title><link>//danielbeck.net/archive/yeah-gonna-skip-that-one.html</link><guid>//danielbeck.net/archive/yeah-gonna-skip-that-one.html</guid><description><![CDATA[<p>Meeting invite with six acronyms I don’t know in the title and no agenda. Nope.</p>
]]></description></item><item><pubDate>Mon, 27 Jan 2025 15:27:07 GMT</pubDate><title>UX opinion</title><link>//danielbeck.net/archive/ux-opinion.html</link><guid>//danielbeck.net/archive/ux-opinion.html</guid><description><![CDATA[<p>If there exists no action a user can take as a result of your user notification, it didn’t need to be a notification.</p>
]]></description></item><item><pubDate>Wed, 29 Nov 2023 17:00:00 GMT</pubDate><title>Adventures in Obsolete Software</title><link>//danielbeck.net/archive/adventures-in-obsolete-software.html</link><guid>//danielbeck.net/archive/adventures-in-obsolete-software.html</guid><description><![CDATA[<p>Gonna keep the names in this one a tiny bit vague because I'm not sure I should be talking about it in public.</p>

<p>(How's that for a hook? Are you interested now?)</p>

<p>So I was a freelance developer for a very long time, mostly in distance learning.  In 2003 and 2004, I did a gig for a major publisher, pretty much single-handedly building the front end for  a tool that could generate customized websites for each of their titles -- it was a very early precursor to today's learning management systems.</p>

<p>Having taken a long round trip out of that industry and back again, I now work full-time for that same publisher, and just for fun thought I'd try to ask around and see if anyone remembered that old tool I built back in the day.</p>

<p>Friends: they're still using it. Prominently. Almost unaltered.  The design is unbelievably dated, significant parts of the UI are broken, and there's still a "this feature is temporarily disabled" apology popup that I remember adding to one of the widgets a couple decades ago -- but it's still in use across a majority of their titles; subsidiary to their new products, but still in there as a top level link.</p>

<p>It predates git (we were using Concurrent Versioning System for code management; the "commit messages" are a string of comments at the top of each file).  It predates browser support for PNGs. It predates jQuery. It predates HTML5.  It *definitely* predates all current frameworks.  
Worst of all, it had the misfortune to be built during the years of The Great XML Delusion, when the entire industry suddenly became convinced that XML was the Way Things Should Be Done, so the entire front end was built as a gigantic wad of XSLT templates, a complicated and obsolete language that nobody in the present day wants to relearn (myself included!)    Which probably goes some way towards explaining why the broken bits are still broken.
Here's the best part:  some years after I built it and moved on, I went to a UX conference with Kate Krolicki where one of the presentations was devoted to tearing that exact product apart from a usability point of view (I had introduced what I thought was a clever navigation mechanism, which turns out to not have been clear to a lot of users).   So that was fun too.</p>
  
<p>I have found the person responsible for maintaining it and apologized.   I should probably track down a generation of educators and students and apologize to them too. </p>

<p>All this is to say, to my tech-oriented friends: if you ever feel like your work is too ephemeral, that it'll all be replaced when the next framework fad sweeps in, if it ever seems like you're just building sandcastles that'll get washed away by the next tide....  remember that that's a <i>good</i> thing.</p>]]></description></item><item><pubDate>Sun, 16 Jul 2023 19:14:56 GMT</pubDate><title>Terrifying Tales of Codebase Complexity</title><link>//danielbeck.net/archive/terrifying-tales-of-codebase-complexity.html</link><guid>//danielbeck.net/archive/terrifying-tales-of-codebase-complexity.html</guid><description><![CDATA[<p><i>This was an interview with the nice folks at <a href="https://digma.ai">digma.ai</a>, as part of <a href="https://digma.ai/blog/coding-horrors-tales-of-codebase-complexity/">their Coding Horrors series</a>.)   (You may have noticed I've been doing a lot of these interviews lately; it's a mutually beneficial arrangment: they get content, I get deadlines and accountability to force myself to write things instead of just thinking about writing them.  Also some pretty quality swag. I think it suits everyone involved!</i></p>


<h3>What's the worst, most horrifying codebase you've ever worked on? What made it so challenging or nightmarish?</h3>

<p>This one’s only horrifying in retrospect; at the time I thought it was some of my best work. (Yes, it’s 100% my fault.)</p>

<p>The product in question was at heart a content management system for generating variations on a specialized type of website in bulk.  I was responsible for building the front-end system that would take in the website data and pass it through a series of designed templates to output the finished site.</p>

<p>This was during that brief period of the late 1990s when the entire industry had collectively decided XML was The Way Things Should Be Done, so naturally I decided to build the template system in XSLT.</p>

<p>XSLT, if you’re not familiar with it, was a fascinatingly <i>pure</i> language; its purpose was to transform XML structures into other XML structures and was itself written in XML because XML was The Way Things Should Be Done.  </p>

<p>Among other interesting challenges, it was strictly idempotent, which from a philosophical standpoint is awesome but from a practical standpoint meant that – for example – any looping operation had to be done via recursion instead, because incrementing a variable for an iteration loop counted as a side effect, so was Not Allowed.  Control flow was best done through data decomposition instead of branching logic. And so on.  To people used to scripting languages and markup, it was a real brain-breaker.</p>

<p>I loved it.  No longer did I need to wheedle the specific bits of data I needed from the backend guys, it would all just come at me as one gigantic wad of XML, and I could shuttle it through my increasingly gigantic wad of XSL templates to generate anything I wanted. I had so much power! I could do anything!</p>

<p>Now, to be clear, the entire time I was enjoying myself doing this, I knew full well I was working in a doomed language. This was long before modern front end frameworks existed; at the time “front end” skills generally meant you knew Photoshop, HTML, CSS, and maybe a handful of javascript recipes you’d lifted from other sites using “View Source”.   And here, by contrast, was this ultra-verbose, weird-looking “front end” language that required some relatively advanced CS concepts compared to what web developers were used to at the time.  No way was this going to last. </p>

<p>But I was loving it, I was learning those advanced concepts and feeling like something of a badass for being able to do it.  Over the course of a year or so I built up a pretty substantial set of these templates which gradually got less terrible as I learned what I was doing; towards the end, I was writing highly decomposed, idiomatic code that I considered clever, and sometimes even “elegant”.  Got them to the launch date, collected my contract fee and moved on to the next job feeling good about myself.</p>

<p>I have it on good authority that they kept those XSL templates in place, untouched, for the next five years until the product was scrapped and replaced altogether because literally no one at the company could understand how they worked.   The clever, elegant code was the worst part of course. My earlier, clumsy approaches were the most readable.</p>

<p>That was an important lesson. Dumb, readable code is infinitely better than clever.  </p>

<h3>Describe a horrifying architectural decision you encountered in a project. How did you deal with it?</h3>

<p>This was during my freelancing days.  One of my regular clients – a midsize corporation that outsourced a lot of development work – called me in a little bit of a panic:  they’d contracted out a small project to a new vendor, the work was complete and they were nearing the launch date.  Once they started replacing the test data with the real thing, though,  they’d started running into major performance issues: the whole site bogged down when it had more than a tiny amount of data to work with.  The vendor was blaming the hardware and recommended upgrading to a much more powerful and expensive server.   The client called me in for a reality check before spending that money.</p>

<p>Long story short, the problem turned out to be a utility function these guys had written to make it more convenient to talk to the database: you’d feed it a SQL query, it’d open the db connection, run the query, return the results, then tidy up and shut down the connection.</p>

<p>Very nice, and it did make their code very readable.  But the problem, which I’m sure many readers have spotted already, is that opening and closing a database connection is a slow, expensive operation: ideally, you want to open it once, run all your queries, and then close it only when you’re completely finished.  The way these guys had written their code, it was opening and closing the connection for every individual operation, meaning sometimes hundreds or thousands of times: once to load a list of data, once again for each and every item in the list. No wonder the server was bogging down!</p>

<p>This turned out to be an easy fix – just remove the ‘open’ and ‘close’ operations from the utility, and move them to the beginning and the end of the program instead of repeating them inside loops.  But it was a good demonstration of the danger of shortcuts, and the difference between being able to get something to work, and understanding why it works and what it’s doing under the hood.  They never would have had this issue if they had had to write code to open and close the database every time they were doing it, but the fact that it was tucked away in a utility out of view made it easy not to notice.</p>

<p>I think about this pretty much every time I install a new npm module or otherwise import someone else’s code… what otherwise sensible thing is it doing that might ruin my day?</p>

<h3>Refactoring Disasters – A story of how you failed?</h3>

<p>We had two separate but related web products, built in separate repositories by different teams using different code styles.  We wanted to merge those into one product.</p>

<p>Both codebases were large enough that refactoring them into a sensible, unified repository would be a long-term project; we needed a shorter term solution in the meantime.</p>

<p>What we should have done is left the code where it was, unified the UI, and had the site navigation link back and forth between each product as needed.  </p>

<p>What we did instead was copy all the code from product A into subfolders in product B’s repository, with the intention of later on gradually refactoring the code from both to match each other, and find and eliminate duplicate functionality as we went.</p>

<p>This might have worked out okay! Except for the fact that the engineer assigned to copy the code over decided it would be a good idea to start doing some of that refactoring as he went; he made a number of substantial changes to the code on both sides according mostly to his own personal taste, to varying degrees of completeness.  </p>

<p>He mostly managed to avoid breaking things in obvious ways during this process but also managed to set many subtle traps for his fellow engineers who weren’t aware of the (of course undocumented) changes he’d made.  He then, of course, promptly resigned to join a rival company.  </p>

<p>(If you’re thinking this whole situation points to major flaws in both the management and the code review processes of that organization, you are not incorrect!)</p>

<p>So we ended up doing that long term refactor in double time, in public view.  We got there, but it was quite a ride, involving one of the most rueful retrospectives I ever hope to be part of.</p>

<p>Last I heard, that company was in the process of “breaking up the monolith” and starting in on decomposing that unified front end into, uh, separate but related products.</p>

<h3>Have you ever had to deal with a third-party library or framework that caused unexpected issues or complications?   </h3>

<p>On October 4, 2021, Facebook screwed up their DNS records and locked themselves, and their associated APIs, offline most of the day.  This took our application down with it because it was too tightly bound to those Facebook APIs, implicitly assuming they would never be offline.  I mean.  It’s Facebook, right? Why would Facebook go offline?</p>

<p>Our frantic code rewrite to correct that took most of the day, plus five minutes – in other words, their API came back online almost immediately before we finished deploying the changes that allowed us to work without that API.</p>

<p>Oh well. At least we were ready for the next time.</p>

<h3>Have you ever had a terrifying "oops" moment or made a coding mistake that sent shivers down your spine?</h3>

<p>I’m pretty strict about making sure I never have access to the production server because I don’t ever want to be the guy who accidentally breaks something on prod.</p>

<p>I have been this guy, though:  “Oh what’s this extra code still lying around unmerged?  I’ll just tidy up a little bit.”  I still have a screenshot from Slack that day:</p>

<p><img style="border:1px solid" src="/img/content/shouldnothave.jpg"></p>


<p>That was just code, though.  You can always untangle code problems.  The most truly terrifying moment of my career takes us way back before Slack, before hipchat, all the way back to the email era.</p>

<p>This was at a small but established startup.  One of our customer support people sent a late-night message to a bunch of the team, looking for advice on how to handle some issues with a particularly demanding customer.  I don’t remember at all what the specific issue was, but it turned into one of those after-hours griping sessions, all of us blowing off a little steam emailing each other our complaints about how difficult these people were and how unreasonable some of their requests…  The cc list kept growing, everyone from sales to engineering to the CEO got their digs in, and eventually, the CSR got the answer she needed and went to send that to the customer.</p>

<p>And then came this message back to the list:   </p>

<p>“Uh… guys?  Guys I think I accidentally just forwarded this whole email thread to the customer”</p>

<p>Cue roughly ten minutes of silence, during which everyone presumably had small heart attacks while scrolling back through the reply-all chain to see which awful statements they were going to have to personally apologize for.  It turned out to be a false alarm, she hadn’t in fact sent the whole thread to the customer – but, yeah, that was a cold sweat moment I hope never to have to go through again. Broken code is fixable.  People, now, that’s another story.</p>
]]></description></item><item><pubDate>Tue, 31 Jan 2023 16:14:45 GMT</pubDate><title>Things I didn’t know about management, before I went into management</title><link>//danielbeck.net/archive/what-do-managers-do-all-day.html</link><guid>//danielbeck.net/archive/what-do-managers-do-all-day.html</guid><description><![CDATA[<h3>aka What Do They <em>Do</em> All Day?</h3>

<p>I was talking about software development with some software developers, as one does.  And one of those software developers said a thing that I found really interesting:</p>

<blockquote>“Realistically having no hierarchical structure at all is actually the most suitable design pattern.”</blockquote>

<p>This is a great example of the sort of thing I believed about management, before I actually became a manager. I now know it to be absolutely incorrect.</p>

<p>(I also am aware of how self-serving it sounds for a manager to say that, and that it's a long shot to be able to convince anyone who hasn't actually experienced it otherwise; but I'mma give it a try.)</p>

<p>There were a tremendous number of surprises in store for me when I first officially crossed over to the management track -- not least, that it was in fact a full-time job.  When I was first asked to take on a job with the word “manager” in the title, I did so under the illusion that I would be able to continue productively coding alongside my managerial duties.  That lasted... maybe six months.  Two things happened: first off, there just simply wasn't time enough in the day to do both the building and the managing -- there's effectively an infinite supply of tasks available in both piles.  And we had other people around who could do the “building” part.  Second, I just wasn't being a terribly effective developer, even when I could carve out the time for it: once you're no longer regularly working within a particular codebase, it starts to move on without you.  The tasks that I could reasonably take on with my split attention and availability got progressively smaller as time went on, until it became obvious it would make a lot more sense for me to let go of the IDE.</p>

<p>But so let’s go back to that “having no hierarchical structure at all is ideal” thing. Sure, as a manager I’m able to fill my days and then some, but maybe I'm kidding myself: maybe it's all just bureacracy and sitting in on meetings, and I'm at best ineffective or at worst an active hindrance to getting things done.  It sure feels that way from the developer’s seat, sometimes.  So now that I've played for both teams I'm going to try to list out, first off, why management happens; and then what it’s actually good for. </p>

<h3>Management Is Inevitable</h3>

<p>Companies are made of people. People have opinions. Opinions differ. Absence of hierarchy can work in an extremely small group; in a teeny tiny startup you may be able to achieve consensus on every significant issue, but at any real scale at all there are inevitably going to be conflicts that must be resolved somehow. For a company to be successful everyone needs to be pulling in at least mostly the same direction. It doesn't even necessarily have to be the best possible direction, but if you're all canceling each other out you're not going to get anywhere.</p>

<p>Even in the total absence of hierarchy, when those conflicts arise, one of two things will happen: it’ll fall apart, or a hierarchy will naturally emerge. And ad hoc hierarchies tend not to be sustainable for long. The leaders that naturally emerge in that sort of situation are often the least suited to leadership, they're too often the ones who talk the loudest or with the most certainty, not the ones with the best understanding of what's really needed or how to get there. For another, stepping up to that leadership position means taking on a buttload of extra work and responsibility; if there isn't some sort of compensation for that, the only ones who'll be willing to take it on are the ones who are in it for the power and status. So, again, the least suitable people. </p>

<p>If you want good leaders you need to treat it as what it is, a job that's distinct from day-to-day engineering, with sufficient rewards (financial or otherwise) to make it worth taking on.</p>

<p>So, fine, we've got a relatively flat hierarchy, now we grow the company a bit more, enough that we need two or three or four teams, more than a single manager or lead can reasonably handle... guess what, someone needs to make sure those teams aren't working in conflict, so guess what, you either end up accidentally letting the least qualified people drive the bus or you officially add a layer to the hierarchy.</p>

<p>Now zoom out a bit more, you've got engineering, you've got a product team, you've got a design team; someone's got to make sure they're working together and communicating with each other and etc. And so on. End result: large scale bureaucracy.</p>

<p>(And yeah, the bigger a company gets, the heavier its bureaucracy gets, and the more they slow down. That's part of the natural lifecycle of companies, and it's why startups can still succeed -- they can move faster at smaller scale while they hope to grow up (or get absorbed in). And all that extra bureaucracy and slowness has a hidden benefit: it acts as an insulator against bad ideas. The costs of a catastrophically bad decision as a startup are relatively small: you just go out of business and try again. In a giant company, a catastrophically bad decision can end up costing millions and millions of dollars or putting thousands of people out of work or, like, reshaping all public discourse if you're named Zuck or Musk... so maybe it's not a bad thing to slow that new idea down long enough to be sure.)</p>

<p>And aaaaaall of this so far is just the "telling people what to do" part, which is arguably the smallest part of what a manager does all day.</p>

<h3>A Sampling Of What Managers Do Besides Tell People What To Do, In No Particular Order </h3>

<dl>

<br>
<dt><b>Recruiting and internal career development.</b></dt> 
<dd>You can't just hire people and put them to work, it's not that simple. Senior engineers come in with their own opinions about how to do things, you need to make sure they become aligned with the rest of your codebase and strategy. Most of the time you want to promote from within, and put the people who already know how your code and product works in control of more of it -- this means identifying the good future leaders, encouraging them to grow those skills, finding tasks for them that will let them learn and make mistakes and grow their abilities and knowledge. It also often also means gently dissuading the ambitious but not-suited-for-advancement developers from trying to put themselves in a role that will be harmful to the company, or finding ways to satisfy that ambition more productively. And it means finding training and continued education for everyone at all levels, so they don't stagnate or fall out of date.</dd>
<br>
<dt><b>Establish processes and structure.</b></dt> 
<dd>There is so. much. more that goes into creating a software product than just writing the software. How should we organize the work itself? Scrum? Kanban? Something else? What should our code review process look like? How do we ensure code quality? What should our tests look like? How much time should we devote to maintenance vs new feature work? How do we decide what to prioritize and when? What should we document, and to what level of detail? What does our QA process look like? How much of all of this should be left loose now, at this stage of our company's growth, to evolve organically rather than being imposed from above?</dd>
<br>
<dt><b>Risk management.</b></dt> 
<dd>What are we going to do if things go wrong? If the proverbial engineer gets hit by a bus, or that server crashes, or that high-value customer starts asking for a lot of custom feature work, or asks us to comply with some new security or legal standard [shakes fist at SOC2], or someone oopsies on the command line in production, how do we recover? How do we prevent those things happening in the first place? Who should have access to this data or that server or the other customer's email address?</dd>
<br>
<dt><b>Vendor and third-party partnerships.</b></dt> 
<dd>There are a billion SaaS products out there to help with everything from observability tooling to recruitment and interview processes to static code analysis to data storage to etc etc etc. Which ones are most appropriate for your company at this stage of its lifecycle and budget, or should you be rolling your own? (Sure, you could treat this as a set of specialist roles, and decide which specialists you can find and want to hire -- but be careful; a database specialist whose only context for the rest of the department's work is being the database specialist, are they going to be able to make good decisions about what the people who'll actually be using the database every day will need?)</dd>
<br>
<dt><b>Cross-departmental advocacy and strategy.</b></dt> 
<dd>Sales wants a constant stream of new features to sell. Engineering wants to spend the next few months refactoring the garbage code they had to churn out for the last few months' constant stream of new features. Design wants to update the UI across the product line. None of those people are wrong, there are always competing interests, and management within all of those groups and more need to either figure out how to come to consensus or how to define a new hierarchy so someone can make the decision and get us all pulling in the same direction again.</dd>
<br>
<dt><b>Morale, culture, and personalities.</b></dt>
<dd>Employee A needs a lot of handholding but is afraid to ask for help. Employee B has some kind of beef with Employee C that neither of them wants to talk about. Employee D is talented, but not nearly as talented as they think they are. Employee E is low-key racist. Employee F is usually great but is going through a divorce so isn't really focused on getting their sprint done. Employee G just wants to punch the clock until retirement. Employee H is a rockstar in the IDE but has limited English-language skills. Employee I has a grating personality. Employee J doesn't see the value of unit tests, so refuses to write them, and their code keeps breaking in production. Employee K keeps showing up to meetings late or not at all, and even when they do you're petty sure you know the reason their camera is always off. Employee L is bored with what they've been working on and wants to switch to a feature area they don't have any experience in. Employee M keeps trying to shed their workload onto Employee N. Employee O is basically useless and everyone knows it, but their uncle is on the board. Employee P is a complainer. Employee Q has a lot of great ideas but no followthrough. Employee R is quiet, poker-faced, and impossible to get a read on. Employee S puts in the hours and then some, but their code is unreadable. OK, those are your reports, now figure out how to get all those people working together as productively as possible, or decide which ones are unsalvageable and need to be fired (but figure out how to do that in a way that won't freak out the rest of the department). Good luck have fun!</dd>
</dl>

<p>So, yeah, that's some of it.  I was sort of aware, when I worked as a developer, that this sort of thing was going on; but the amount of day-to-day energy that has to go into it, and the degree to which that effort shapes the company, really caught me by surprise. All those meetings and memos and directives and decks aren't just for show or to get in the way of the real work.  (Even more surprising was seeing from the other side the amount of influence individual non-managers also have on shaping the future -- but that's a whole other story, we'll save that one for later).</p>

]]></description></item><item><pubDate>Mon, 30 Jan 2023 17:57:47 GMT</pubDate><title>...taps microphone</title><link>//danielbeck.net/archive/taps-microphone.html</link><guid>//danielbeck.net/archive/taps-microphone.html</guid><description><![CDATA[<p>...well, okay, I predicted 2026, so I'm about <a href="/blog/1344.html">three years early</a>.</p>

<p>Code gets dusty awfully quickly!   What keeps happening is, I get distracted and forget to update this website for a while, and then the code rot sets in and I'm <i>unable</i> to update the site for some extended period of time until I get around to either fixing it up again or replacing it completely.</p>

<p>I did not, this time, have to rewrite the technology underlying this site from scratch in order to get it running (though I was tempted, and actually got a pretty good way into building a web components-based static site generator before I came to my senses.)</p>

<p>Instead, I had to</p>
<ul>
<li>Fix an encoding error in the database, where at some point the UTF-8 content got re-encoded as ISO 8859-1 causing a lot of "nÃƒâ€šÃ‚Â£" mojibake.  (I spent a while barking up the wrong tree on this one: the encoding in the static-rendered files was correct, and the mojibake only showed up on hydration; therefore I spent way longer than I should have fiddling with content-type headers, thinking the data was getting corrupted in transit. Turns out the static files just predate the database problem.)</li>
<li>Get a working Vue install running on a new machine.  Since I'm the only one using this software, I set up this site so that the authoring tools appear when running in development mode, but are not currently included in the production build.  This is very convenient, and means everything is in place to turn this into a multi-user site if somehow I ever found a reason to do that; but means that to write a new blog post I have to actually run the site build tools locally in dev mode.  The code was all sitting comfortably in a git repository, that part's fine, but </li>
<ul>
<li>most of its dependencies are out of date or outright deprecated.</li>  
<li>The command-line tool for <i>installing</i>  the framework and its dependencies was deprecated.</li>
<li>I had to install new old versions of node, npm, node-sass, and eventually python, which some build tool deep in some sub-dependency's stack wanted for some reason</li>
<li>(And then update each of those a step at a time to get them as current as possible without introducing too many breaking changes)</li>
</ul>


<li>Having done all that, and finally getting the site to run locally, I discovered I needed to track down a 'credentials' file which I had carefully .gitignore'd (because you don't want tokens in the cloud!), and therefore lost, (because the cloud is where I keep all my stuff!)</li>
<li>I also needed to temporarily disable the part of my code that checks the user's password, because I had forgotten it and it was only stored in encrypted form in the database. (For whatever reason, I built really robust security into a blogging tool that will only ever be used by one person.  There's a nonce on every api call to mitigate bearer token theft. I don't know why I thought I needed that.)</li>
<li>Lastly I needed to modify the SQL table structure again, because somewhere in the process of  debugging the encoding issues way back in step one, I dropped and recreated a table, and lost the auto-increment setting on one key.</li>
</ul>

<p>And now I have a functioning website again. Easy as that!</p>

<h3>Narrator: It was not as easy as that</h3>

<p>Turns out that while developer mode is working fine, so I can talk to the database and add and edit these posts, building a deployable update to the app is still not possible.  Something deep in the internals of PrerenderSpaPlugin is, I'm pretty sure, getting from something deep in the internals of webpack a Promise when it's expecting a callback, or maybe the other way round, anyway static renders are failing silently and I haven't yet figured out why.</p>

<p>Modern software development is mostly a matter of gluing things to other things, connecting this framework to that database using this dependency and etc. That sure doesn't mean it's gotten easier.</p>

<p>(In particular I feel like we're due for a reckoning for putting so much trust in npm. It's so convenient depending on other peoples' code, but those dependencies go out of date or accrete incompabilities so quickly, even if you're actively maintaining a project it can be hard to keep up with new vulnerabilities and breaking changes from dependency updates; set a project aside for a while and you're pretty much guaranteed to have to rebuild its whole infrastructure from scratch next time you want to pick it up again.)</p>
]]></description></item><item><pubDate>Sun, 22 Jan 2023 14:05:53 GMT</pubDate><title>Developer Observability</title><link>//danielbeck.net/archive/developer-observability.html</link><guid>//danielbeck.net/archive/developer-observability.html</guid><description><![CDATA[<p><em>This is another one destined for the <a href="https://sprkl.dev/working-blind-the-importance-of-developer-observability/">Sprkl Dev Blog</a>. Here you get to see it in its prepublication state, because you came straight to the source. (Thanks for that, btw).    You may be mildly disappointed to learn that, unlike the last round, this one is pretty much unchanged.</em></p>

<h3>The bad old days</h3>

<p>From the invention of javascript in 1995 to the release of Firebug in 2006,  the only way to debug your client-side code or design was trial-and-error: if something wasn’t working, or didn’t look right, you’d change something, see what happened, and keep trying until you either figured out the problem or, well, didn’t.</p>

<p>We’re not talking about littering your code with `console.log` instead of using a debugger – there was no console. There was no DOM inspector. There was just the rendered page and your source code and an F5 key worn smooth from constantly reloading the page after every change.</p>

<p>We could get away with this, mostly, because at the time what was happening inside the browser was much less complicated than the activity on the server: the browser was just for layout and maybe some light interactivity. Anything significant that might go wrong with the application logic would show up in the server logs where you could track it down later.</p>

<h3>Observability in modern software development </h3>

<p>These days, when your entire application is just as likely to be running inside the browser with the server doing little but handing out data through an API, that’s not good enough. While you’ll still run into the occasional novice whose idea of debugging consists of using the `alert()` box, few people would argue that that’s the best or even a viable approach.  </p>

<p>In-browser developer tools started out as little more than a console for logging ajax requests, but over the years have grown into a robust set of tools for examining our work while we’re working on it: you can easily inspect any DOM element to see which CSS rules are affecting it and why; you can pause your code while it’s running to see or even modify its internal state; measure performance directly to identify problems, even use higher level tools built for specific frameworks to examine for example React component state. </p>

<p>And these tools will continue to grow in power and available functionality both within the browser and with more targeted tools.</p>

<h3>But once that application goes into production, you’re working blind again.</h3>

<p>If you have ever found yourself asking an end user if they know what a developer console is, and if they know how to open it, then you know how challenging it can be to identify and debug a problem that is only happening on someone else’s machine. “Hit F12 and try to describe what you see” is a frustrating experience for the user and the developer both – but what are worse are the problems you never even find out about, either because it’s only partly broken and the user assumes it’s supposed to be like that, or because it was so irretrievably broken they abandoned your product altogether.</p>

<p>If you’re finding yourself in that position, you probably want to consider investing in some observability tooling for your app.  Sometimes called “real time user monitoring” (RUM) or “digital experience monitoring,” at heart this is, basically, the modern front-end equivalent of those old-school server logs: tracking client-side errors by logging them as they occur and providing detailed information about the error, such as the browser and version, the location of the error in the code, and the user's actions leading up to the error. This information can be used to identify and fix issues quickly, improving the user experience.</p>

<p>In principle the most basic form of this monitoring is an afternoon’s coding exercise: catch all errors, post error messages to server, job well done! But in practice there’s some nuance to making sure you’re not missing anything: monitoring software is maybe not quite as useful if the errors you’re monitoring for can prevent the monitor from running.   </p>

<p>For any nontrivial application, unless you are extremely budget-constrained I’d suggest investing in one of the existing observability tools purpose-built for this sort of thing – they’ll have more robust data capture than you can easily build yourself, can scoop up lots of additional useful information along the way (which user had the problem? What browser, on what operating system, from what region, etc?) and will also generally include search and visualization tools for searching through all that captured data, flagging newly discovered issues for your developers’ attention, and generating all the charts and graphs your management team could ever desire.</p>

<h3>Sifting through observability data: uncovering relevant insights </h3>

<p>The observability tool I’m most personally familiar with – I’m going to choose not to name and shame, because from what I can tell this is a common problem – while it captures a tremendous amount of useful information, it does not always offer the most intuitive ways of surfacing that information. The UX has, let’s say, a steep learning curve. At my last org we had to make conscious effort to remind engineers to actually dig through those reports regularly, and to train them up on how to locate the relevant data for a specific user complaint – you can set alerts for major outages, but tracking down the right information to explain a problem only one or a handful of users were having wasn’t always the easiest. </p>

<p>The fact that we were responding to user-reported errors and then trying to find the explanation in the captured data is already a sign of this not working as well as it could:  ideally we would have been identifying and resolving these issues without the user needing to report them to us. Better than not having the data at all, of course, but the tooling is not the whole story; it takes care and diligence both to configure these tools usefully, and to use them effectively. As above, monitoring software is maybe not quite as useful if nobody’s looking at the monitor or if the monitor is capturing so much unneeded data that it becomes difficult to identify what’s significant.</p>


<h3>Observability, not surveillance</h3>
 
<p>It’s important with any data capture tool to use that data responsibly, and with sensitivity to both legal and human concerns. Once you’ve built in the tooling to capture errors, it’s pretty straightforward to also capture information about the user’s session that aren’t errors – up to and including, well, literally every action the user takes. Used properly this can be tremendously useful: you can see which features users prefer and how they use them, which parts of your application load too slowly, where users give up on your sales funnel, what info they type into every form field… and at this point hopefully the PII issues here are obvious: particularly if your application handles financial, medical, or other sensitive data it’s extremely important to filter out info you don’t want to be capturing, and to control who in your org is able to access what you do capture. In all cases you need to make sure your Terms &amp; Conditions have the proper disclosures about what you’re capturing and how you’re using it. I’m not a lawyer, don’t ask me; talk to someone in Legal at least once before you start playing with these tools, is what I’m saying.</p>

<p>And even with the data that’s not inherently sensitive, it’s important to make responsible use of it. That customer on the support call who’s complaining that they’ve been struggling to get past an issue in your product for HOURS and HOURS – it might be personally satisfying to tell them that you can see in the logs they tried twice and then gave up, but the customer is probably not going to be happy about that interaction even after you solve their issue. Basically, don’t let your use of these tools cross over from observability into surveillance.</p>

<h3>TL;DR</h3> 

<p>The work we do these days is too complex and too important for it to be feasible to simply throw your code into production and hope it works.  Depending on user bug reports guarantees you’re not seeing the problems in your code early enough; for any user who took the time to contact your support team, there are probably dozens or hundreds who encountered the same problem. Observability tools are not magic and they have some drawbacks – existing tools can be complex to configure, difficult to use effectively, and are frequently expensive – but they’re an essential part of the modern developer’s arsenal.</p>
]]></description></item><item><pubDate>Sun, 27 Nov 2022 19:23:13 GMT</pubDate><title>An Interview With Sprkl</title><link>//danielbeck.net/archive/an-interview-with-sprkl.html</link><guid>//danielbeck.net/archive/an-interview-with-sprkl.html</guid><description><![CDATA[<p><em>Note: This interview was reworked into <a href="https://sprkl.dev/37-tips-for-improving-productivity-in-software-development-teams/">37 Tips For Improving Productivity In Software Development Teams</a> on the Sprkl developer blog. I'm posting the original Q&amp;A version of it here; it's probably less SEO-ready than the bullet list of hot tips, but I think it's a little more readable.</em></p>


<p><b>Can you please tell us about yourself? Your technical experience, cool projects you’re working on, and all the fun stuff:)</b></p>

<p>I’ve been working on web-based applications for as long as the web has been around to work on: the browser in use at my first job was NCSA Mosaic. (We were all very excited when Netscape came along and introduced innovations such as a background color that wasn’t gray.)  It was pretty easy to get into the industry back then, you just had to learn all five HTML tags and you were all set; from there it was just a matter of keeping up with changes as new ideas get introduced and old ones fall out of favor. I’ve worked as a designer, a UX specialist, in product development, and in engineering teams; I’ve done stints as an IC and in management. I even tried the solopreneur thing for a while, during which I learned I really need someone setting external deadlines for me if I’m going to get anything done.</p>

<p><b>Please describe your organization's R&amp;D department structure.  Specifically, your team? (Size, roles, etc.)</b></p>

<p>I’ve done my share of “real” jobs, but much of my work has been as a consultant, which means I’ve been able to see inside a lot of different organizations at everything from startup to global scale.  In practice, while the details differ across orgs, this generally boils down to one of three general situations:</p>
<ul>
<li>
Startup scale.  Small team, low process overhead, everyone has full visibility into what everyone else is doing, the codebase is greenfield and the product definition is still pretty vague.  
</li>
<li>
The transitional phase, where that startup starts to find success and suddenly needs to start working at scale.  There are lots of potential pitfalls here – practices that worked just fine when you were all in the same room start to fail, and it’s really easy for companies to lose focus or jump to the wrong solutions.</li>
<li>
The well-established organization: there’s a process for everything, roles are well defined, and the scope of authority for any given team or individual is smaller and more focused.   It’s hard to ruin a company at this stage – all the bureaucracy that’s built up over time acts as an insulator against bad ideas – but it’s also hard to keep up the pace or do anything truly innovative. (Unless you spin off a skunkworks and start the cycle anew!)
</li></ul>

<p>Each of those phases has different challenges and needs a different structure. </p>

<p>In an early startup you probably shouldn’t even try setting up too much process or code architecture; any predictions you make about what you’ll need before you find your product market fit are likely to be wrong. </p>

<p>In a very large organization the main challenge is visibility and trust: now you’ve got multiple departments – design, product, engineering, program management, etc – each with multiple layers of management all trying to work on the same product.  All of that structure is necessary to organize the large numbers of people involved, but it can lead to a disconnect between decision-makers and actual reality.</p>

<p>That middle zone is the really challenging one – you really do have to throw out a lot of what used to work, which can be very painful for the people used to working that way.  (It’s also, in my opinion, the most interesting: it’s where you really get the opportunity to make big changes and to build for the future.  At a startup you have to just keep trying things until one works; at an established organization most of the interesting decisions have already been made.)</p>

<p><b>
On a scale from 1 to 10, how complex do you think your code base is and why? (i.e., Kubernetes, local clusters, Monolith or microservices, DBs, Git methodology (trunk or feature branches), Monorepo or multi repo, etc.)</b></p>

<p>I’m afraid I’m going to dispute the premise of the question a little bit here.  There are different kinds of complexity; some of them are unavoidable (algorithmic complexity), some of them are self-inflicted (tech debt or conflicting code styles), some are organizational (business rules evolve faster than code does), some of them are tradeoffs you make to reduce other kinds of complexity.  </p>

<p>So the trick isn’t “let’s make our codebase less complex,” it’s identifying which complexity is harmful, and which is necessary for the current stage of your company.</p>

<p>The architectural complexity of microservices or Kubernetes is a great example of tradeoff complexity: microservices, Kubernetes, Terraform et all are inherently much much more complex than their traditional equivalents; that complexity is the price you pay for scalability. I see way too many small or mid-size companies jump into these complicated solutions too early, or just because they think they need to, and end up accepting that architectural complexity before they’re feeling the pain points that would justify it.  If you’re not routinely needing to spin up and configure new containers, you don’t actually need Kubernetes. That pool of Terraform-configured step functions could probably have been built a lot more quickly and easily as a plain old API.  Basically, if you’re not working at FAANG scale, you probably don’t need FAANG-scale tooling to get your job done.  </p>

<p>Git methodologies are another good one.  I’m old enough that my first encounter with source control was CVS, in which developers would literally “check out” the file they were working on, blocking anyone else from touching that file until they checked it back in. (That’s one way to prevent merge conflicts!)  Subversion improved on this, it had what could charitably be described as “branches”, but it wasn’t until git that a real branch-and-merge strategy was really viable; to work effectively before git you had to do a lot of communication and keep your changes small and focused. </p> 

<p>What engineers who grew up on git tend to forget is that it was designed for a specific purpose – managing a large number of contributions from a variety of external sources into the linux kernel – which doesn’t necessarily match the way a lot of engineering teams work.  (In a way git itself is another architectural complexity tradeoff: you accept the fact that merges are hard, in exchange for allowing independent teams to work simultaneously on the same code.)  GitFlow was a fairly elaborate process that evolved, mainly, to minimize the pain of those merges.  The thing is, though, most engineering orgs aren’t the linux kernel, they’re not made up of teams of external contributors who have no choice but to work independently and deal with the conflicts at the end. So it’s interesting to me that that trend is now starting to swing the other way, as more and more organizations realize that smaller, more focused commits merged constantly are just a better way to work (for lots of reasons, not just avoiding merge headaches, but that’s a key one).    </p>

<p>I’m 100% a convert to trunk-based development after seeing how much it improved our process at my last organization; switching from long-lived branches to quickly-merged code and a simple feature flag system  was one of those rare cases of an absolutely unambiguous improvement; the whole problem of code merges just evaporated overnight.  Don’t get me wrong, I love git, you couldn’t pay me enough to go back to the bad old days of file locks, but long-lived branches are unnecessary and cause more problems than they solve. I wouldn’t be surprised if some future version of “source control” ends up looking a lot more like real-time collaborative editing than like what we’re used to doing today.</p>

<p><b>Can you describe your development process? (Describe a common process from writing the code locally until it reaches production) Do you follow a certain methodology?</b></p>

<p>Every single organization I’ve worked with in the last couple decades has described themselves as using an Agile methodology.  None of them mean the same thing by it – the only thing everyone agrees on about Agile is that everybody else is doing it wrong.   “Agile” as a concept is a little overripe at this point; the consultants have got hold of it and formalized a bunch of rules and roles that I’m not convinced fit every organization that tries to use them.</p>

<p>But the core principles of it are still essential:</p>
<ul>
<li>Work in short, iterative cycles, both for planning future feature development and for the design and implementation. </li>
<li>Check what you’re building against real users as frequently as possible, to make sure you’re building the right thing. </li>
<li>Maintain a culture of open feedback between product, engineering, and design – they are not separate processes.  </li>
<li>Same thing between labor and management.   Developers need to feel safe telling their bosses they've made a wrong decision.</li>
<li>Same thing within engineering teams; developers should be reviewing each others code, suggesting improvements, and accepting feedback from one another.</li>
<li>Move small changes into production frequently, rather than doing a few big releases with big changes.  </li>
<li>Iterate, don’t redesign.</li>
<li>Automate everything you can, earlier than you think you need to.</li>
</ul>


<p><b>Where do you think the blind spot in your delivery process is?</b></p>

<p>I think the most important and challenging part of coding is not the delivery process, or the build process, or the testing or the framework or the documentation – it’s in deciding what to deliver in the first place.   If you can nail that part, if you can predict accurately enough what your users need,  the rest pretty much just follows on its own.</p>

<p>Keeping your releases small and frequent makes this much easier, because you don’t have to predict with perfect accuracy: you can try out a small thing, iterate on it if the users like it, or abandon it without too much sunk cost if they don’t.  </p>

<p>This is tremendously challenging for a lot of organizations; especially in those not used to continuous delivery there can be a lot of pressure to stuff too many ideas into every new feature.  Which leads to a vicious cycle: overstuffed releases take longer to develop, which increases the pressure to stuff even more things into version n+1, because everyone knows it’s going to be a long time before you’ll get a chance to add anything in version n+2.</p>


<p><b>At which phase do you perform testing? (i.e., local, CI, production)</b></p>

<p>Personally I’m a big fan of test driven development when I’m building something complicated, less because of the resulting code coverage and more because it’s just easier to think through whatever the problem is one edge case at a time instead of trying to reason about it all at once.  Write a test for each case, write code until all the tests pass, and you’re done.</p>

<p>This doesn’t necessarily result in tests that will be particularly useful after the code has been written, though.  It's pretty rare that an old unit test will suddenly pick up on a bug in unmodified code. So you also need to be doing some integration testing to make sure all your bits and pieces are working together -- it's much more common for a change in module A to trigger unexpected consequences in module B.  I'm not sure there's a one-size-fits-all approach to this, it really depends on the product and the scale you're working at. Maintaining a quality test suite can be a lot of work especially when your product is going through a lot of changes: it's really a whole separate codebase that has to be kept up to date with any changes in feature or business logic, and there's always pressure to be writing more features instead of writing more tests.    At small scales, or in periods of rapid change, manual testing may be more efficient than trying to maintain a fully automated test suite; as the features start to stabilize, or grow past the point where testing everything by hand is feasible, it's important to make time to set up a real staging environment with production-like data, and set up automated workflows against it to make sure the outcome is what you expect.</p>

<p>And of course you'll miss things. It's inevitable.  So you have to have production monitoring, some telemetry that'll notify your engineers when something breaks in real users' hands.  (And you have to have a process in place that ensures the engineers actually see those notifications and can claim the time to do something about them.)</p>

<p><b>Do you see the connection between complexity, feedback, and productivity? Do you measure developers’ productivity, and if you do, how? </b></p>

<p>I actually spend a lot of my time trying to talk management out of leaning too heavily on productivity metrics.  They’re tempting traps, because there are so many numbers you can measure and charts you can make and it all looks so much like science that you could be forgiven for forgetting that they don’t actually measure productivity. </p>

<p>We’ve all figured out that counting lines of code or hours-on-keyboard are useless metrics, so far so good; now we just need to learn the same lesson about code coverage, PR size, TTO, TTM, story points per sprint, rework percentage…  All of those things can be meaningful signals, but they’re not measurements of productivity. A long cycle time might indicate any number of different things: maybe the requirements were unclear or are changing, maybe the team is having to refactor a lot of legacy code before they can progress, maybe the team got walloped by some other unplanned work, maybe there’s a lot of friction somewhere in your development process, maybe the thing the team is working on is just genuinely difficult, maybe there’s disagreement within the team about how to build the thing, maybe somebody’s slacking off and bottlenecking the rest of the team. The point is you just don’t know from the metric itself whether it even is a problem, let alone what to do about it.   (I’d much rather have a team with the slow cycle time because they went back to the product team to clarify the requirements, than the team that just plowed ahead and built the wrong thing very quickly.)</p>


<p><b>What efforts do you implement or recommend to enhance your or your teams’ productivity? </b></p>


<p>The thing to remember, the really important thing, is that engineers like solving complicated problems. They like writing code and building things, that’s why they’re in this line of work!  Give an engineer a meaty problem, the scope and authority to solve that problem, and a development environment that isn’t going to get in their way, and they’re going to be productive every time.</p>

<p>My main goal as an engineering manager is to get out of my teams’ way, and to do my best to keep the rest of the organization out of their way too.</p>

<p>The biggest productivity killers:</p>

<p>“I don’t know why we’re building this feature” is a huge one.  If a team is building something just because they were told to, and not because they understand its value, they’re going to be undermotivated (and will likely build the wrong thing, to boot.)  The best solution to this is to have as few people as possible between the engineers and the actual users, and to empower your engineering teams to push back on ideas that don’t make sense to them.</p>

<p>“I spent all day in meetings” or “interrupted by questions” or “responding to pagerduty tickets” or similar.  This one’s pretty well-known; software engineers need uninterrupted focus time. Make sure they get it. Encourage them to block out segments of the day in their calendars, reduce the number of routine scrum ceremonies and planning sessions you subject them to, and if someone keeps peppering your engineers with questions or one-off requests, empower your engineers to say “no” (and find some less-interruptive way to get that person what they need).</p>

<p>“I spent all day tracking down [a bug / the right config / a particular error message / a stray semicolon]”.  Everyone gets hit by the occasional head-scratcher of a bug that takes way longer to sort out than it theoretically should have, and to a point that’s fine.  But if it’s happening routinely, that’s another signal that needs looking at: maybe your code isn’t sending out accurate error messages, making bugfixes take longer than they should; maybe your engineers are working in an environment or context they’re not familiar enough with or that is too bleeding-edge; maybe they’re working in an inefficient way. (This last one is, ironically, especially common in orgs that put a lot of emphasis on fast delivery: engineers under pressure to churn out code don’t feel empowered to take the time to figure out, say, why their sourcemaps stopped working three months ago, so instead spend time trying to debug compiled production code.  You need to give your team time to streamline their own processes.)</p>







]]></description></item><item><pubDate>Wed, 10 Aug 2022 18:00:00 GMT</pubDate><title>SaaSy</title><link>//danielbeck.net/archive/saasy.html</link><guid>//danielbeck.net/archive/saasy.html</guid><description><![CDATA[<p>Drawback of having the words "senior" and "manager" in my job title: I could easily spend my entire workday, every day, in cold calls and "quick 15-minute chats."</p>
<p>Friends, don't let friends start any more business intelligence SaaS products, there are more than enough already</p>]]></description></item><item><pubDate>Mon, 01 Aug 2022 17:00:00 GMT</pubDate><title>I got fired</title><link>//danielbeck.net/archive/i-got-fired.html</link><guid>//danielbeck.net/archive/i-got-fired.html</guid><description><![CDATA[<p>If you're not attuned to what high-level corporate feedback sounds like, you can go a <i>surprisingly</i> long time believing it to be praise.</p>

<p>(Not me in this case.  I've long wished for a way to put, like, a five-year delay on my posts so I can safely talk about work stuff.  Check back in 2027 for the scoop on that one, I guess.   As preemptive penance for vaguebooking, here's a story from my own career that fits):</p>

<p>I got fired from my first real job in this industry.  It was legit, and the right choice for the company: major mismatch between me and the CEO, both he and I were frankly too young and inexperienced to resolve it appropriately, and honestly I had kind of lost faith in the mission and was not putting in the energy needed by a startup at that phase of its lifecycle. (Hindsight, amirite?)
It was the early days of Internet 1.0, so like all internet companies ours was run by a bunch of children and one graybeard, as was the fashion at the time. Our particular grownup was <a href="https://en.wikipedia.org/wiki/Dick_Sabot">Dick Sabot</a> who, among his many more significant accomplishments, was able to inform me that I should under no circumstances walk into that building ever again, in such a way that had me nodding happily along in agreement.  It wasn't until literally hours later that the penny dropped and I realized I was newly unemployed.  Skills.</p>

<p>(Here I am now, almost three decades later, in a managerial position myself.   I'm semi-fluent in corporate comms -- I can hear and understand it, but never came within a mile of Dick's level of fluency in delivering it; instead I've opted for a much more blunt "I have no poker face whatsoever, you will know at all times exactly what I think of your ideas."    Which suits! Because I do, in fact, have no poker face whatsoever.  FWIW my reports seem to appreciate that directness; those managing me tend to either value it highly or be supremely irritated by it, not much in between.</p>]]></description></item><item><pubDate>Mon, 25 Jan 2021 17:00:00 GMT</pubDate><title>Stack Overflow Security</title><link>//danielbeck.net/archive/stack-overflow-security.html</link><guid>//danielbeck.net/archive/stack-overflow-security.html</guid><description><![CDATA[<p>Fun detail in this recap of a <a href="https://stackoverflow.blog/2021/01/25/a-deeper-dive-into-our-may-2019-security-incident/">Stack Overflow security incident</a>: the person hacking SO was also using SO to figure out how to do it.</p>

<blockquote>"the attacker is clearly not overly familiar with the product so they spend time looking up Q&amp;A on Stack Overflow on how to use and configure it. This act of looking up things (visiting questions) across the Stack Exchange Network becomes a frequent occurrence and allows us to anticipate and understand the attacker’s methodology over the coming days."</blockquote>]]></description></item><item><pubDate>Fri, 13 Sep 2019 21:28:18 GMT</pubDate><title>My yesterday, in Slack form</title><link>//danielbeck.net/archive/my-yesterday-in-slack-form.html</link><guid>//danielbeck.net/archive/my-yesterday-in-slack-form.html</guid><description><![CDATA[]]></description></item><item><pubDate>Thu, 28 Mar 2019 23:21:15 GMT</pubDate><title>Getting a dev team to understand the importance of small details</title><link>//danielbeck.net/archive/getting-a-dev-team-to-understand-the-importance-of-small.html</link><guid>//danielbeck.net/archive/getting-a-dev-team-to-understand-the-importance-of-small.html</guid><description><![CDATA[<p>If I had to boil down everything I've learned in over 20 years of UI/UX work, it'd pretty much be this.</p>

<p><small>(I'm copying this over from a <a href="https://ux.stackexchange.com/questions/94982/getting-a-dev-team-to-understand-the-importance-of-small-details/">Stack Exchange</a> answer I wrote a few years back, basically because I want to be able to link to it as part of my portfolio in a way that will make sense to people who don't live and breathe Stack Exchange.  This was written for UX designers; if I were to put together a corresponding essay from the developer's point of view it would... well, it would be the same but different; I may need to think about doing that one of these days....)</small></p>

<h2>Question</h2>
<blockquote>As we know, in UX design it is important to care about pixel level details in addition to the big picture. Meaning that all UI elements are perfectly aligned, correct colour, etc. However, from time to time I get comments like "is this really important, maybe users will not notice this?" from other dev team members.

What would be the best way to get people understand the importance of pixel precision and small details?</blockquote>

<h2>Answer</h2>
<p>I've been on both sides of this one, at different points in my career. Defusing this type of conflict gracefully is <i>extremely</i> important for an organization: once the relationship between dev and design becomes an adversarial one, your product will suck, it's just a matter of time. The "Stand your ground! My way or the highway!" type of response are going to be awfully tempting, especially in the moment, but will be counterproductive in the long run.</p>
<p>There are certainly cases where this is simply the result of laziness or a lack of skill on the part of the developer. We've all seen that happen, 'nuff said. There are, equally, cases where it's arrogance or a lack of knowledge on the part of the designer -- I've been on the receiving end of layouts for the web that were put together by someone with a good eye but no understanding of how HTML works, which would have been genuinely, and (more importantly) unnecessarily difficult to implement without a bit of adjustment.</p>
<p>But even in the best circumstances, assuming good faith and talent on both sides, this sort of conflict will still arise. Negotiating this is a long-term process -- below I'm going to be describing the best case scenario to aim for; not all of this will be fully achievable in all organizations or situations, but at least it may give you a sense of what to aim for (or of whether your org is already so dysfunctional as to be beyond salvage...)</p>
<h3>Find your allies</h3>
<p>Some developers care more about usability and product appearance than others; some will simply be better at it than others. If your dev team is large enough to have split into front-end and back-end specializations, this sorting-out process will likely already have started for you; otherwise start paying attention to which of the developers seem literally unable to see whether elements are aligned or the wrong color, and (through product management, or individual conversation, or machiavellian intrigue, or whatever works in your organization) try to get the least-interested-in-UI developers assigned to tasks where they can do the least damage.</p>
<h3>Get developers involved early in the design process. </h3>
<p>The worst case scenario, to be avoided at all costs, is the one where you throw a completed design over the wall to the dev team and move on to your next task, while they're left in isolation to implement it. The more you can integrate those processes, the better for everyone.</p>
<p>This doesn't mean "ask the developer to do some of the design work" -- but the dev team needs an opportunity to chime in on a design early, to point out aspects of your design that may prove difficult to implement, or even to contribute technical details that could make the user workflow easier. This can also give them time to shape their early development work in ways that will make implementing your final design easier or faster or just plain better.</p>
<p>The social aspects of this are worth mentioning as well: exposing developers to your design process, rather than just its end results, can give them a better understanding of what goes into the design and why; and conversely it can help the design team to:</p>
<h3>Understand the technical consequences of what you're asking for</h3>
<p> Some design changes are easy. Some would require substantial rewrites of large chunks of code. It's not always going to be obvious which is which; often it depends on implementation choices that were made years ago. Maybe the technical consequences of that beautiful design are just too high; maybe there's a different or modified design which would serve the same purpose at a much lower cost. Part of this is a matter of keeping lines of communication open between the teams, but part of it is the responsibility of the designer to have at least a baseline understanding of how those designs ultimately get built. The (thankfully increasingly uncommon) photoshop-only designer is simply not qualified to do web design, in my opinion -- they're going to constantly be making design mistakes that they don't even know are mistakes. This benefits no-one.</p>
<h3>Be able to articulate specifically why what you're asking for matters</h3>
<p>I constantly use this as a reality check on my own designs, even when I'm working solo: I find that if I can't describe, in words on paper, why a particular aspect of my design needs to be the way it is, then it probably doesn't.</p>
<p>It's not enough to say "it looks better this way," you have to be able to explain why it looks better that way.</p>
<p>This is a vitally important career skill. It's crucial for communication with management and with developers, of course. But it'll also make you a better designer, because it forces you to examine your own work critically, and to understand in a rigorous, methodical way, which aspects of your design actually work well and which ones are just pretty. Pretty is important, but it's not sufficient.</p>
<p>(The "users won't notice that" thing, incidentally, is a red herring. Users often won't notice that -- that's the goal; if they're noticing something, it probably means they're noticing a problem. Users also don't notice whether the dev team has normalized the database properly, or whether they picked framework X over framework Y, but that doesn't mean those choices are unimportant. Similarly, most users may not consciously be aware that an element is off alignment or a slightly wrong shade of blue, but enough of those will contribute to an overall impression of sloppiness or lack of polish.)</p>
<h3>Prefer style guides over mockups</h3>
<p>A mockup, by definition, only covers a single program state; it's not possible to build mockups for every possible situation, so at some point or another the developer is going to be left to come up with a way to cover some case you didn't think of. If there's a solid, comprehensive style guide in place for the project, they're much more likely to come up with something that works. If there isn't, they'll either have to come back to the design team to ask for more mockups, or they'll just wodge something together the best they can. You know how well that usually works out.</p>
<p>Another advantage to style guides over mockups is that it makes the developer more involved in thinking about the design as a design. Few people enjoy just doing the grunt work of fulfilling someone else's plan to the letter -- it's much more engaging and motivating to be empowered to contribute to that plan, if only in small ways. Given a good set of ground rules, most (admittedly not all) developers will be more than capable of doing so.</p>
<p>And a third advantage: it keeps you honest as a designer. It's easy to inadvertently gloss over the hard parts of a design when building a mockup: your lorem ipsum fits tidily in the space available, the amount of content is always just right, that messy edge case dialog box isn't necessary, etc. Designing rulesets and guidelines, rather than individual screens, forces you to think about the product as a system rather than as a collection of pretty pictures, which always benefits the end result.</p>
<h3>Choose your battles</h3>
<p> "Pixel perfect design" is not actually the goal, and it's very important not to slip into that mode of thinking. A completed, usable, attractive product is the goal. This, as with all other aspects of design, is a matter of acceptable compromise between competing interests; this necessarily includes the developers' interests.</p>
<p>The fact is, some pixels are more important than others. Before wading into a fight on any particular issue, make sure it's going to be one for which the payoff is worth the battle. Be prepared to accept pushback and critique from the developers just as you would from management, sales, and end users, and do your best to work with them rather than against them.</p>]]></description></item><item><pubDate>Tue, 19 Dec 2017 01:24:18 GMT</pubDate><title>Front end frameworks</title><link>//danielbeck.net/archive/front-end-frameworks.html</link><guid>//danielbeck.net/archive/front-end-frameworks.html</guid><description><![CDATA[<p>I've now done substantial work in all three of the current major front-end frameworks (React, Vue, and Angular.)</p>

<p>This means that I at last feel sufficiently well-informed to make the following statement:</p>
 
<p>JSX is an abomination upon the earth; a soulless attack on the very concept of markup languages; an unreadable frankensteinian mishmash of not-quite-javascript with not-exactly-HTML whose purported advantages are more easily accomplished in other frameworks by just being sane about how you structure your templates.</p>

<p>I do not like eeeet</p>

<p>ok end of nerd rant thx</p>]]></description></item><item><pubDate>Thu, 07 Sep 2017 17:00:00 GMT</pubDate><title>UX recommendation</title><link>//danielbeck.net/archive/ux-recommendation.html</link><guid>//danielbeck.net/archive/ux-recommendation.html</guid><description><![CDATA[<p>Every once in a while I get hired by a company that's already had a different UX firm go over their product, and I get to look at their wireframes and design recommendations and etc.</p>

<p>It really makes me feel a lot better about the quality of my own work.  And a lot worse about the quality of the industry I work in.</p>
  
<p>Srsly I'm sitting here looking at a glossy ppt deck full of insights like "No users in the test understood what this button was for. Recommendation: draw more attention to it by making it bigger and bolder" I mean COME ON</p>]]></description></item><item><pubDate>Fri, 01 Sep 2017 01:46:46 GMT</pubDate><title>Getting all the paperwork in order</title><link>//danielbeck.net/archive/getting-all-the-paperwork-in-order.html</link><guid>//danielbeck.net/archive/getting-all-the-paperwork-in-order.html</guid><description><![CDATA[<p>So I'm in the middle of starting a new freelance gig, and we're in the getting-all-the-paperwork-in-order phase, so when I got an email this afternoon asking about getting the paperwork in order for starting a new freelance gig with a company I've never heard of it took me an extra long time to realize that it was in fact intended for a completely different Daniel Beck.</p>

<p>Trufax guys, I was seriously tempted to just play along and see how far into the job I could get before anyone realized I was not who they thought they were hiring. I srsly think I could maybe have pulled it off, it would have been a little bit of a stretch, but I could totally learn python if someone was paying me to</p>

<p>AND ALSO why are so many people named Daniel Beck software developers? I mean really, it's just implausible. Besides this guy and me I know of at least one in Brazil and another in Germany (because over the years I've received mail meant for each of them, because I have the firstname.lastname@gmail address and they don't.) Is it that common a name? Does something about it draw people towards algorithms? Are our simulitarian overlords just being lazy? EXPLAIN</p>
]]></description></item><item><pubDate>Thu, 27 Apr 2017 05:00:00 GMT</pubDate><title>Prefixes</title><link>//danielbeck.net/archive/prefixes.html</link><guid>//danielbeck.net/archive/prefixes.html</guid><description><![CDATA[<p>Two sequential headlines on Hacker News right now:</p>
<ul>
<li>Firefox 46 supports some -webkit prefixed CSS properties </li>

<li>WebKit is moving away from prefixes</li>
</ul>

<p>(Emily didn't get it either. Trust me, it's funny)</p>]]></description></item><item><pubDate>Thu, 21 Jan 2016 05:00:00 GMT</pubDate><title>Brave</title><link>//danielbeck.net/archive/brave.html</link><guid>//danielbeck.net/archive/brave.html</guid><description><![CDATA[<p>OH FUCKING HELL the project I've been working on?  I just got scooped by a superficially-similar-seeming product launch headed by a Huge Name with Major Connections.  God fucking damnit.  Now anything I release is going to look like it's in response to that thing.  Which looks godawful. But because it is headed by a Huge Name it will suck all the air out of the room anyway.</p>

<p>Shit.  And many other expletives.</p>

<p>EDIT</p>

<p>Thanks folks for your kind words after my little temper tantrum this afternoon.  After some more research I'm no longer at all concerned -- the products (I'll stop being coy, it's brave.com) are far less similar that I at first thought, and our end goals are, let's say, entirely orthogonal.  Which is nice, because I didn't fancy my chances going head to head against Brendan Eich. </p>

<p>Also it, uh, surprise, sorta turns out their product head is an old friend.  Small world! (Hi, Elissa! I can't say I'm a fan of your company's business model, but, seriously, congratulations, that's a major step up)</p>

<p>So I'm taking this as the kick in the pants I needed to start moving more quickly, and (soon) more publicly, on this thing. Maybe even pick a name for it. (The domain name for my working title "unfuck the web" is taken. Probably for the best.)
But I'll cook dinner first.  The web'll probably wait *that* long at least</p>
<p>I hope</p>]]></description></item><item><pubDate>Fri, 03 Jul 2015 05:00:00 GMT</pubDate><title>The vile impulse</title><link>//danielbeck.net/archive/the-vile-impulse.html</link><guid>//danielbeck.net/archive/the-vile-impulse.html</guid><description><![CDATA[<p>oh god I am beginning to understand the vile impulse that drives developers to inflict new clientside frameworks upon the landscape</p>
<p>Somebody stop me before it is too late</p>]]></description></item><item><pubDate>Wed, 27 May 2015 05:00:00 GMT</pubDate><title>How to software</title><link>//danielbeck.net/archive/how-to-software.html</link><guid>//danielbeck.net/archive/how-to-software.html</guid><description><![CDATA[<p>I figured it all out
The designer's job is to be an optimist.  The developer's job is to be a realist.  DevOps's job is to be a pessimist.  QA's job is to be a completionist. Sales's job is to be a fantabulist.  Production and customer support's job is to be Sisyphus. </p>

<p>That's everybody covered, right? I'm pretty sure that's everybody</p>]]></description></item><item><pubDate>Thu, 21 May 2015 19:28:32 GMT</pubDate><title>For some reason</title><link>//danielbeck.net/archive/for-some-reason.html</link><guid>//danielbeck.net/archive/for-some-reason.html</guid><description><![CDATA[<p>Hey do you guys remember those special kids books you could buy in like 1978 where it’d be a regular old kid’s book but they’d have printed it with blank spaces where the protagonist’s name would be and through the magic of dot matrix printing and six to eight weeks shipping and handling they’d fill in your own personal name into all the blanks, so it’d be just like the hero of the book was <em>you</em>? Only in a completely different typeface from the rest of the book, because dot matrix, so it’d be super obvious where they’d filled in the blanks. Remember those?</p>
<p>For some reason this recruiter’s email reminded me of that</p>
]]></description></item><item><pubDate>Wed, 06 May 2015 05:00:00 GMT</pubDate><title>The bug</title><link>//danielbeck.net/archive/the-bug.html</link><guid>//danielbeck.net/archive/the-bug.html</guid><description><![CDATA[The only thing worse than the bug you can't fix is the bug you can't replicate but that keeps getting reported]]></description></item></channel></rss>