Category: development

  • Racing Robots

    This was originally published on the Creative Coast’s (now Startup Savannah) blog way back in 2016. With AI, it’s feels even more relevant now.

    Similarly, the impulse to keep to yourself what you have learned is not only shameful, it is destructive. Anything you do not give freely and abundantly becomes lost to you. You open your safe and find ashes.” — Annie Dillard

    I’ve been organizing Savannah’s RailsBridge chapter for a few years now. By all accounts, it’s been a success: we’ve run more workshops as a small Southern city than anywhere else in the world except San Francisco, NYC & Boulder/Denver (suck it, Atlanta), introduced over 300 people to programming, helped a baker’s dozen find new careers they didn’t realize were possible, and provided a place for the local tech community to meet and help their neighbors.

    But, the longer we run these workshops, the more it feels like a rain drop in a forest fire. Introducing people to programming is a great way to get me back in touch with what it feels like to be a beginner, and the students’ excitement and questions about what they should learn next are a great reminder that there is no clear path to success in programming – or in the future of work, which is really what we’re here to talk about. This thought has been tumbling around in my head for years now and has surfaced in a few different venues, but I’ve never really sat down to put it all in text.

    After World War II, a whole generation entered the middle class thanks to the need for skilled labor to build our industrial future. Factories were humming. Unions were organized and fought for their members. Public highway and other construction projects kept millions of people busy. It was possible for someone who was just willing to work hard and learn a skill to enter, and stay in, the middle class without a college degree. A lot of Americans think it’s somehow possible to go back to that glorious industrial paradise, that we can somehow put all those people back to work in factories that either no longer exist, or have been completely re-staffed with robots.

    That’s not going to happen. Those days are gone. China didn’t steal all those jobs – robots did. And it’s not just the factories. Wal-Mart’s wholesale destruction of Main Street? Robots. Amazon’s annihilation of small bookstores? You guessed it, robots again.

    “Somewhere, something incredible is waiting to be known.” — Carl Sagan

    Back to programming: it’s the blue collar skilled work for this century. In your spare time, using free resources on the web, you can learn enough to get yourself and your family to the middle class – without a college degree. I did it. A lot of my friends did it. There are at least two generations of great developers who don’t have computer science related degrees – because the web, especially the web at scale, moved faster than university curriculums could keep up.

    While it’s harder now to go from zero to “job”, it’s still possible, and people still do it all the time. It’s why everyone is so interested in coding bootcamps and why STEM is on the tip of every politician’s tongue when they talk about education. But, turning everyone into a programmer isn’t going to keep the robots at bay, and it’s not going to keep everyone employed when 50-70% of the jobs that exist today just… disappear.

    We are all racing robots for our jobs

    We are all racing robots for our jobs. Most of us haven’t realized this yet and are about to get trampled and left behind. That sounds dystopian, but the more I think about it, the more apt that image is. The small bookstore owners can tell you about it, so can the store owners that used to have stores on Main Street USA, and our grandparents who used to assemble cars.

    “If you do a job where someone tells you exactly what to do, he will find someone cheaper than you to do it. And yet our schools are churning out kids who are stuck looking for jobs where the boss tells them exactly what to do.” – Seth Godin

    We’ve failed generations of students in preparing them to race robots. We still rely on Industrial Age education methods, meant to churn out obedient little factory workers. Sorry, but we don’t need those anymore. That’s what the robots are for. We are failing our children right now by not teaching them the skills that will keep them ahead of the robots. Teaching everyone to be a programmer isn’t the solution – it’s just the one thing we can point to as being somewhat robot-proof (even though it’s not). We need to break it down further and realize that the economy of the future will have very few places for unskilled labor. Anything that’s done by rote will be automated.

    And just because you sit in an office and work on a computer, don’t think you’re safe. Don’t think we’ll see robot lawyers, accountants and insurance agents? How much of preparing taxes is really just complex repetition? Quite a bit when you really break it down. Just think of how many jobs will just… not exist. My 50-70% number looks like an understatement now, doesn’t it? The days are already gone where you learn a skill in trade school or in college and then spend your entire career doing that one thing.

    Even baby boomers held an average of 11 different jobs in their careers, and that number is probably only going to grow. I wouldn’t be surprised if our children end up with an average of 11 different careers during their working lives. So, given all this dystopian information, what do we do about it? How can we prepare the next generation for a world where their jobs will continually disappear?

    “If you’re not prepared to be wrong, you’ll never come up with anything original.”Sir Ken Robinson

    We need to change how we educate our children and make it more closely match how they’ll be forced to adapt to an ever-increasing rate of change. That means that rote learning, fact regurgitation, testing as the only tool for measuring fluency… all of those things need to be burned to the ground. In their place, we need to teach:

    • Resiliency, flexibility and problem solving: They will constantly be presented with new problems and will have to come up with solutions based on very little information. We need to teach them how to do just enough research to solve a problem, and I don’t have a word for it, but I’ll call it Minimum Viable Fluency: what’s the minimum amount of knowledge you need to have about a subject in order to solve the problem at hand? I can’t tell you how often I have to go from zero to MVF in order to put out the latest and greatest fire at work.
    • Entrepreneurship: The future of work is most likely a series of freelance gigs that kind of turn into what we think of as a job. There’s not a lot of security in that, so we need to teach them how to find, quantify and exploit opportunities in the market. They need to have all those tools at the ready so they can move, adapt and survive.
    • Teamwork Across Diverse Skills and Experience: The more diverse the set of experiences and outlooks brought to a problem, the more likely it is that the team will find the best possible solution. That means we need to learn how to work with groups with different perspectives, experiences and talents than our own. We can’t build the future without including as many people as possible.

    “But, it is not in despair that I paint you that picture. I paint it for you in hope – because the nation, seeing and understanding the injustice in it, propose to paint it out. We are determined to make every American citizen the subject of his country’s interest and concern; and we will never regard any faithful law-abiding group within our borders as superfluous. The test of our progress is not whether we add more to the abundance of those who have much; it is whether we provide enough for those who have too little.” — FDR

    All of that brings me back to Savannah. Our lovely city is in a precarious position when it comes to the future I’ve laid out. We have a 26-28% generational poverty rate. That number has stuck like glue for thirty years and shows no sign of budging. All the social programs and services the city, county and state have put in place are barely keeping up have failed to put even a dent in the number. When all of those low-wage jobs get automated away? When the port is 99% automated? When hotels no longer need people to clean toilets or make beds? That 26% will look like a golden age. I wouldn’t be surprised if the poverty rate doubles in the next twenty years. No tax base, no new hotel, parking garage or marathon, will be able to cope. I’m not going to go into the systemic reasons that some people in our city want to have a quarter of our neighbors living in poverty. I don’t care what their reasons are because the outcome of those reasons is unacceptable.

    It should be unacceptable to the vast majority of us who live here that a full quarter of us are below the poverty line. We are wasting billions of dollars in human potential because we refuse to admit our complicity in the situation and resolve to fix it. The more research I do, and the more I learn about this, the more convinced I am that addressing and fixing Savannah’s poverty is the key to building a Savannah that will thrive through the future of work. If we don’t, the robots will win and our social infrastructure won’t be able to cope with the shock to the system. You would think that I’d be in my backyard digging my bunker to sit out the end of the world, but I’m not. I’m convinced that we can solve these problems if we work together, get creative, and work like hell.

    “By all means, break the rules. Break them beautifully, deliberately and well. That is one of the ends for which they exist.” — Robert Bringhurst

    Where do we start? It starts with what I said above about education. Those same skills need to be shared across the community. Here are just a few of the things I think we need to focus on:

    • We need to support and grow our small businesses to better take advantage of social media, modern web-based tools, and better capture the 2.6 billion dollars tourists spend in our city every year. Growing those small businesses means they can hire more employees, and we get to keep more of those 2.6 billion dollars in the community.
    • We need to embrace the successes of The STEM Academy at Bartlett and put them into practice at schools all over the system. There’s no excuse to have this internationally-recognized jewel of a school in our city and not use what works there to improve our neighborhood schools.
    • We need brave and daring local leaders to stand up and speak out. Governments act when constituencies are well-organized and loud. Too many of us have been too quiet for too long. That’s going to mean reaching out across Savannah’s well-fortified silos and working with Savannah’s amazing and dedicated non-profits and activists, having uncomfortable conversations, and working together on the things we can agree on, while accepting that there will always be things we don’t.
    • Along with those leaders, more of us need to pay closer attention to the decisions made at every level of government and keep our elected leaders accountable to us, their constituents. If we don’t speak up, they’ll listen to those who do. If we don’t pay attention, they’ll never have to answer for their actions.
    • We need to be better about sharing and celebrating our successes, coming together to learn from our failures, accepting our place in history and coming to peace with it, and then working to make the future brighter for all or our neighbors.

    None of these things are impossible. We have a community of creative, committed and energetic people. We have all the human capital we need. We know the tools exist, and we have some local examples of things that work. All we need to do is put them together. I remain, as always, optimistic about the future. Not because I think things will be perfect, because that’s silly. I remain optimistic because I believe in our capacity as human beings, neighbors and friends, to improve and increase our capacities. The greatness of the American Dream is that we accept that our union isn’t perfect and that every day all of us are responsible for making it closer to the more perfect ideal.

    “Optimism isn’t principally an analysis of present reality. It’s an ethic. It is not based on denial or rosy thinking. It is a moral posture toward the world we find ourselves in. If everything seems great, there’s no need for optimism. The river of good news just carries you along.” — Josh Marshall

  • Wrapping up National Blog Post Month

    Between writing a blog post almost every day and going back to the beginning of this blog and re-reading stuff I wrote over twenty years ago, it’s been a bloggy month over here!

    I only missed two days. I can live with that. I’ve blogged more this month than I have in years, and that was the whole goal.

    My big learning from this experience is that social media really killed my blogging. If you look at the first few years of posts, I sometimes posted multiple short posts in a day and maybe one longer thing a week.

    Now, I never write short posts. They’re all longer than a paragraph, and that’s what blogging means to me now, which I think is misguided and too inspired by more “professional” blogs. This is my personal space, and I should use it to post whatever inane nonsense is on my mind. It’s not a diary, but it is kind of a public journal of what I’m thinking about – a perennial first draft of things that might become something more professional in the future.

    I need to give myself permission to post the first draft (sorry in advance), and be OK with it living forever(ish). Because that’s what blogging should be – the great empathy engine of the web. It’s our thoughts, our selves, out there for anyone to stumble across and get a glimpse of our lived experience. Whether you’re me, a cishet white male with serious dad energy, a writer in Minnesota, or a famous sci-fi author in Ohio, your life is worth talking about. Your thoughts are worth sharing.

    I probably won’t post once a day, but I’m hoping I make blogging a habit again. Fingers crossed!

  • The expert is calling from inside the house

    I’ve played product manager more often this year than I have in years. It’s been a fun role to get back into.

    It’s also been a long time since I played product manager at a larger company. The last two times were tiny startups, and well, it’s a very different experience.

    With tiny startup product management, I didn’t have a lot of internal expertise to rely on, so most of the research was external – I had to find people to talk to, find research, do a lot of research, and figure out how to validate assumptions.

    A lot of that is similar in a larger company, but, the expertise is inside the walls at a larger company. I’ve had great results in all of my recent projects by just asking for folks who have expertise in big public Slack channels and they just appeared!

    I think we frequently discount our own, and our peers’, expertise when doing discovery and research, especially our peers in customer support roles. I think that’s a huge mistake. Who talks to your customer more than the folks in customer support? Nobody. Who knows your product better than the people who have to support it? Pretty much nobody.

    I was able to jump start onboarding to new subject areas a whole lot faster by asking our support teams about their processes and doing user interviews, just like I would with a potential customer, and that lead to some really interesting discoveries and avenues to explore.

    So, don’t take your internal experts for granted! Ask them things! Praise them! Share your results back with them!

  • Avoiding cynicism

    I mentioned this last week, but while I’ve been fixing formatting issues on my old blog posts, I’ve made the mistake of reading some of them. Getting a glimpse of me 20 years ago has been interesting – he was so angry, usually about work, and talked about it a lot.

    That guy was on the verge of burnout every other week, and I think he was actually burned out quite a lot.

    I’m not angry about work anymore. I was last really burned out over five years ago.

    I think if I’d kept going the way I was headed back then, I’d be a cynical burned out husk. I haven’t read beyond the beginning of 2003 yet, but I can’t wait to see when the switch flipped (having a “coming attractions” for my own past is pretty weird).

    If you asked me right now how I avoid being a cynical husk, I think it comes down to my rules for working:

    • Never miss a chance to celebrate. We’re confronted with failure so often at work, that we should celebrate every little win.
    • Focus on the who and the how. We don’t control what we work on most of the time, and pinning our self-worth to the success or failure of the things we work on is a recipe for sadness. So, I no longer really care what I work on. I care about enjoying the people I work with, and focus on how I work. I can control how I work more than I can any other part of it.
    • Compete only with yourself. I try not to compare myself to other people. I’ve got my challenges and other commitments, and I know nothing of theirs. So, I only compete against Past Me™️ – which also helps make sure I’m constantly improving, even if it’s just a little bit.

    That’s not a lot of rules… but they work for me. I might change them…

  • The past is embarassing

    This blog is twenty-something years old, and has moved blogging platforms at least three times, and between various WordPress installs at least another three times. Some of the older posts got messed up along the way, so I’m going back through them and trying to fix them.

    Re-reading stuff I wrote from 2001 is… something. I talked way too much about work (this was before “dooced” was a verb). I don’t remember what exactly I was angry about back then, but I was often very annoyed and not good at not writing about it. I also posted a lot. I’d totally forgotten how short and frequent my post were back then, pre-Twitter.

    I’m glad those posts exist, even the stupid ones. They’re fun to look back on and laugh at what I was excited about (like waiting for a new mac with a 60gb hard drive, and triple booting it – I also did a lot more compiling software than I do today). It turns out, 2001 was the year of linux on the desktop?

    I think the saddest thing is how many of the links are now dead. Most of the blogs I linked to back then don’t resolve, or are for sale.

    Rediscovering blogging has been the best part of , and I probably won’t ever top the 5 posts in one day I used to do in 2001, I’m going to try to post more regularly if only so I can look back in 20 more years at how stupid I was in 2023.

  • Mid-caffeination Mastodon Thoughts

    Derek Powazek posted this on Mastodon yesterday:

    An actual use for machine learning that I’d want: a bot that records all the posts that cause me to block someone, saves them into a db, and then automatically hides posts that match above a certain threshold.

    Derek on Mastodon

    I love a good brain exercise, so I’ve been thinking about it, and I don’t actually think this is that hard, and is very possible using tools you already need to run Mastodon in production.

    I might play with actually implementing this during my week off around cooking and family time, but if someone else wanted to do it, this idea is 100% free.

    To enable search in Mastodon, you have to install and use ElasticSearch. It has machine learning goodies in it already like nearest neighbor and vector search.

    Basically, we should be able to build a very personal spam/block bot for Mastodon given some training data (posts that pushed you to block someone) and some fiddling about (which is the hard/fun part).

    Right now, there are no dates on blocks in Mastodon (I haven’t checked the schema yet to see if they’re there but not returned), and you can’t see which post “triggered” the block. I think that could be added fairly easily – or at least something like “Add this to Blockbot” to use it to train the bot.

    Mastodon doesn’t really have a plugin architecture yet, so I’m not sure if this should be a standalone app that sits alongside your running Mastodon instance or a feature – I’ll probably try it as a feature to get familiar with Mastodon.

    Basically, we take “blockworthy” posts, index them, and then use that to compare posts to the blocklist to get a semantic distance. Once we have the distance we can start manually testing for accuracy and tweak settings until we get something close to a “block score”. Users could then say, “yep, don’t show me anything with a block score greater than 1.5” and ta-da, a little robot janitor is just cleaning up your feed for you. That’s probably computationally intensive to do on every post, but I think you could apply it to people you don’t follow who reply to you to weed out the worst Reply Guys and riff raff.

    You could also have community-wide block bots that are trained on a communal collection of blockworthy posts. It could help get around rigid blocklists by allowing targetted removal of replies from timelines instead of blocking whole instances.

    It could also be used for finding good stuff too… Imagine something that found you people who post things like you do and brought them to you. It could be used as an “attract” bot as well.

    I think ideally, it could be used like left and right handed whuffie. When you come in contact with a profile, how alike and how different are your posts from theirs’? Do we agree on anything? Are our disagreements strong enough, and on topics that are sensitive enough, that I probably don’t want to engage with them? Then it’s more informative than just a robot going out and sweeping up my replies.

    Yeah, this is hand wavey, but a lot of this stuff is just built in to ElasticSearch already, so it’s not like we have to invent anything (yay, because that’s hard). We just have to assemble it and feed it enough data.

    It should be fun, and I think it could be helpful, especially for folks who get inundated with awful replies.

    And if you beat me to implementing it, that’s great! Then it’ll be out there in the world and we can all play with it!

  • Strategic apathy

    I have a bad habit at work of saying “I don’t care” without qualifying it. It comes off as sarcastic or dismissive, when that’s not how I mean it – which means I need to find a new way to express it.

    Most of the time, it pops out of my mouth when my manager asks me if I want to work on something and then she gives me a look, and I have to explain myself.

    Here’s the explanation: I no longer care what I work on. I’ve built one of pretty much anything I’d ever want to build, and the what just no longer matters. What matters to me is how I work, and who I work with. I alluded to this in the post about ficlets, but the individual projects blur together. The thing I remember is the thrill of building something with people. I remember the people, and how I felt while we were building whatever it was.

    I still believe in constant incremental improvement, and only competing with myself. I also now finally understand that just building something that’s technically superior doesn’t guarantee success. Success or failure in the eyes of the market almost never has much to do with the code that implements it. It requires the work of everyone on the team, every discipline, and a ton of luck.

    And all of that means I’d much rather focus on making sure that I’m helping everyone else on the team do their best work, and asking them to help me make sure I’m doing mine. That’s literally all that matters to me at this point. Yes, I love big meaty technical problems, but that’s a very small part of the overall solution. The most important part is the borders where disciplines meet and making sure that those borders are seamless, complementary and supportive of the rest of the disciplines involved. That’s way more complicated, and way more rewarding when it works.

  • App Defaults

    Why not do an old school blogging meme for day 13? Well, that’s what I’m doing today, so… let’s go! I’ve seen it a couple of places, but I last saw it over here, which is where I was convinced that it would be today’s post.

    I’m pretty much all Apple for end-user things. I’m also an Ubuntu users, but I pretty much only interact with it via the command line.

    • Mail Client: Mimestream on macOS, Apple Mail on iOS
    • Mail Server: It’s GMail all the way down.
    • Notes: Apple Notes
    • To-Do: Apple Reminders for long-term and recurring things. I use Day One for short-term to-dos and my daily work journal
    • Photo Shooting: the iOS Camera or Hipstagram if I’m feeling fancy/silly.
    • Photo Management: Apple Photos
    • Calendar: Fantastical
    • Cloud File Storage: Google Drive and iCloud
    • RSS: NetNewsWire everywhere, and I’m so glad it’s back.
    • Contacts: Google + iCloud (they’re a mess)
    • Browser: Firefox for personal stuff, Chrome for work, Safari for mobile. I’m polybrowserous and am fine with it.
    • Bookmarks: Firefox and Chrome (in profiles because you gotta keep things separate)
    • Read It Later: Pocket, but it’s mostly later because I forget to check it.
    • Word Processing, Spreadsheets & Presentations: Google Suite
    • News: The aforementioned NetNewsWire for following blogs like Talking Points Memo (which has been awesome for 20+ years), Apple News+, NY Times, Washington Post, The Ringer and The Athletic.
    • Music: Spotify and my Plex server for live shows and mashups
    • Podcasts: Overcast
    • Password Management: 1Password
    • Code Editor: VS Code, but I really miss Atom.
  • Just trying to be understood

    If you are writing the clearest, truest words you can find and doing the best you can to understand and communicate, this will shine on paper like its own little lighthouse. Lighthouses don’t go running all over an island looking for boats to save; they just stand there shining.

    Anne Lamott

    The creation of all media is accompanied by a wish: to experience and to be experienced by another human mind. Above all this means to feel and to be felt.

    Ze Frank

    Today, you get quotes. So far, National Blog Post Writing Month has me writing longer-than-I-expected posts about things that I either wrote about a long time ago, or things that have been trapped in my head for years and I finally had a reason to write them down.

    All of it is an attempt at being understood… and it’s my favorite thing about personal blogging. It’s one person, quietly sharing their heart, in the best way they know how, out into the chaos and cacophony of social media.

    I’ve been doing it, somewhat inconsistently, for almost twenty-four years. This is the 2,800th post on this blog (here’s the first), and over 2,500 are mine, written by me (my wife also used to blog here once upon a time).

    A lot of those posts are now kind of embarrassing. I don’t think I’ve ever gone back and deleted any (guaranteeing that I’ll probably never be able to run for office – a brilliant bit of subconscious self-sabotage). But, they provide a portrait of what I was trying to make sense of at the time, what was important, and again, all in an attempt to understand and be understood.

    The mind that is not baffled, is unemployed.

    Wendell Berry
  • People are always the problem

    I’m now a very senior engineer. I don’t even know what the right title is (once I got “CTO” titles kind of stopped mattering), but at Gusto I’m an L6 and there are seven levels at the company.

    One of the great things about working at a larger company is how many people I get to work with, and how many opportunities I have to mentor more junior engineers.

    We spend so much time early in our careers just learning the mechanics of our immediate job: how to write code, make it maintainable, how to test it, how to make it performant, etc, etc, etc. That takes years, and is a lot. And then someone promotes us, tells us we’re now a “senior” engineer and we’re now presented a whole new scale of problems, and all of those problems involve people.

    I think the industry does a pretty terrible job of preparing software developers to deal with people problems. We tell them to focus on code, which is important, because that’s the first layer of what’s expected of us.

    If we think about the problems we deal with as we get more senior as layers, I think it’s easier to understand them. To me, in this very much first draft of me putting this into words, the layers are:

    • Code: We have to be good at this to be asked to do anything else (even though almost all code problems are also caused by people).
    • Individuals: We have a manager (at least one), people on our team, product managers, designers, etc. We need to deal with them individually and make sure we get what we need, and meet their needs.
    • Processes: Everything we do at work is some kind of process – the meetings we have, how we deliver code, how we get rewarded for our work, all processes.
    • Systems: Collections of processes in action – I think of them mostly in code, but “the patriarchy” is a system.
    • Organizations: Organizations are just groups of people who create systems in order to accomplish their goals. Depending on the size of your company, you may in a nesting doll of organizations and may interact with several more.

    As you get more senior, you’re expected to be able to solve problems on and across all of those layers. The hard part is figuring out what layers are “crossed by the problem you’re trying to solve, and then peeling them off and solving them – because the tools you can use are wildly different at each layer and require different skills.

    The good part is that solving problems across layers is extremely valuable to organizations, so if you can do it, you’ll be just fine. The bad part is that as soon as you start crossing layers, people are always the problem.