• 0 Posts
  • 15 Comments
Joined 1 year ago
cake
Cake day: June 2nd, 2023

help-circle




  • I’m a NASA software engineer writing spacecraft flight software. A few thoughts:

    1. I’m not at JPL and I don’t know how religiously they follow these rules, but we really don’t. They’re not part of our official or unofficial standard practice. Indeed, I can’t even find a reference to the rules on nasa.gov
    2. Most of these rules are considered obvious these days. Most of the rest we don’t follow either. (at least not absolutely)
    3. This video critically misstates the rule about heap allocation, which is perhaps the most significant difference between how we write software and how non-safety critical systems are written. Dynamic allocation is allowed during initialization. This is a massive, massive difference in terms of how easy it is to write code compared to stack-only.
    4. The video also misses the mark on preprocessor usage. Especially in C, you have very little choice but to rely on the preprocessor. We avoid it, but the kind of multi-path compilation he describes is necessary to enable thorough testing of the code.
    5. We’re still human. Even where the rule is good and we follow it in principle, you will still find all too many exceptions in the actual code.

    If you really want to see how the sausage is made, the software framework used by many NASA missions is open source and on GitHub.




    • Prehistoric C++: Core language for my main project at work. Unfortunately we’re stuck with C++98, but it’s still a massive improvement on C.
    • C: For some of the older parts of the aforementioned project
    • Python: For test automation for the aforementioned project, also rapidly becoming the main language within the community that covers my secondary work project. I used to really not care for Python, but to the extent it displaces MATLAB I’m 100% in favor of it. I’ve also grown to really like it in the test automation role. The only thing I could wish for is that it had a mode that required type hints across the board.
    • Modern C++: Used for my other work project. While I do think that C++11 is a huge step up from C++98, I think the later standards have added a lot of cruft and very little value. Given the choice I would definitely take modern C++ over C++98, but I’d really rather be writing something like Rust
    • Java: This was a mistake I made years ago when I started a project as a very junior developer. Unfortunately I work in a research context where even as the junior developer I was still the most experienced developer on the team when it came to some things. We needed a REST API for this project and doing it in C++ didn’t seem feasible at the time (no idea if it’s better now). Some other teams in my org where using Spring so I jumped on that bandwagon. In hindsight, I wish I had written the API in Python since we’re slowly moving a lot of our C++ code into Python on that project now.
    • Shell: For automation that’s just a little too easy to bother with Python
    • Rust: Only used on hobby projects for now, but it scratches the same itch as C++ a thousand times better. The language itself is wonderful once you get used to the borrow checker and cargo is an incredibly valuable part of the ecosystem as well.