jamesmunns

Doing embedded stuff

Be nice, work hard. Build tools, tell stories. Start five year fights. Kein Ort für Nazis.


A list of all the other services I'm on around the internet


Posts with code highlighted with codehost by @wavebeem.


All posts licensed under CC-BY-SA 4.0, unless otherwise stated.

posts from @jamesmunns tagged #longpost

also:

This is an exploration of what is, and what isn't, useful when a computer system doesn't fully understand a message it receives

NOTE: This is a work in progress post. Treat it more like personal notes than a specific descriptive/persuasive essay for now.

If this is a topic that is relevant to you, and you'd like to sponsor my work on this, send me a message.

Background

I'm the author of postcard, a binary protocol format in Rust. Its messages are not "self-describing", which means that in most cases, the schema can never change.

I'm thinking about adding opt-in runtime schema loading, but first I want to collect some thoughts about this would/could achieve, and what it couldn't.

What do I mean by "doesn't understand"



Today was kind of a tiring day, and had a project delivery I was pushing for, so no full text today for NaTeReMo.

(edit, this ended up being a decently long batch of mini-posts. oops.)

I figured instead I'd list out a couple of ideas bouncing around in my brain for next articles, because I have done no actual planning for this and am sort of flying by the seat of my pants.

Here's a couple shot/chasers for topics I want to write about, but don't know how yet.



In my experience, there is only so much any one person can coherently keep in their mind. You might be able to keep a lot of detail about something small in your mind, or maybe a little bit of detail about a large group of things in your mind. The "size" varies by person, experience, excitement, life situations, and more. But honestly, the exact amount doesn't matter. At some point you will run into a problem that exceeds this size.

Unfortunately, relatively few "whole projects" fit into this kind of space. Especially when you have multiple "components" (e.g. mechanical, electrical, software, etc.), which span different contexts or knowledge domains.

A lot of the tools and concepts around systems engineering are meant to help you in exactly this sort of domain: problems that are too big for one brain.

I think I'm going to talk about three things I think about, which help me tackle big problems:

  • Thinking about "zoom levels" when thinking about a problem
  • Thinking about breaking things down into parts, or "sub-systems"
  • Thinking about how sub-systems interact with each other


Writing intros are hard, so lets cut to the executive summary.

I work as a consultant. I usually work on projects that involve hardware (electronics and mechanical parts), but I usually help on the software side, from microcontroller code, up to desktop stuff, to server stuff sometimes.

Sometimes I get brought in to implement specific things, like drivers or proof of concepts. Sometimes I get brought in when people are looking to move to Rust. Sometimes I get brought in when people are looking to turn a "prototype" into a "product".

Usually, what I end up spending the most time helping people with are the fundamentals of systems engineering.

Maybe this is a case of "when the tool you have is a hammer, all problems look like nails". Maybe I've overdrank the Systems Engineering kool-aid.

That being said, it keeps working and being helpful, so I'm going to keep swinging that hammer.

I might want to write a book on this some day, but here's the start of some unsorted thoughts in the mean time.

I have nothing to sell you (yet), and I promise there are no magic bullets in these writings. Just some things to think about that might help you or your projects.

I am also not a process purist, or religiously tied to the concept of systems engineering. Sometimes doing a little of this work goes a long way. Sometimes (especially if you are doing something safety critical) you need to do everything to the full extent. Do what feels right. If it stops helping, find something else to do. Ideally, all of the concepts I'll describe should start paying dividends almost immediately.

What is Systems Engineering?

I dunno, NASA or someone probably has a better definition, but to me, it covers the domains of:

  1. Be explicit about what you are building
  2. Be explicit about how you are building it

That seems simple, right? Well, sometimes it is.