158: Programming Is Too Difficult for Humans

Embedded.fm · 28 Jun 2016 · 1h 06m

What this episode covers

Fabien Chouteau, a software engineer at AdaCore, discusses the Ada programming language and its suitability for safety-critical embedded systems. He explains Ada's design philosophy, including its formal requirements document (the Steelman document), strong typing, and the SPARK tool for formal verification. Chouteau also promotes the 'Make with Ada' competition, highlighting supported platforms like the STM32 and Crazyflie nanodrone, and demonstrates how Ada improves code reliability through contract-based programming.

Mentioned

Companies
AdaCore, Inspirel
Products
Crazyflie, Pebble Time
Chips
STM32F4
Tools
GNAT, SPARK, QEMU

Other shows on the same ground, closest first.

  • The Pragmatic Embedded Podcast · 50m

    Exploring Rust for Embedded Systems with Philip Markgraf

    Philip Markgraf, an experienced software developer and technical leader, discusses his recent experience building an embedded device for Kelvin, a green energy company, using the Rust programming language. He contrasts Rust's memory safety, sophisticated type system, and excellent tooling with the complexities and legacy constraints of C and C++. Markgraf highlights how Rust's borrow checker and standardized libraries simplify development, improve reliability, and attract motivated engineers, while noting that adoption is still in the early stages for embedded systems compared to cloud computing.

  • The Pragmatic Embedded Podcast · 35m

    Rust with Milica Kostic

    Milica Kostic, an embedded software architect with a background in electrical engineering and safety-critical industries like medical devices, discusses her journey from C/C++ to adopting Rust in production. She explains that the most successful adoption occurred in a greenfield embedded Linux project using a microservice architecture, which allowed for clean isolation of Rust code and minimized complex C/C++ interoperability challenges. Kostic highlights the benefits of Rust's tooling, such as Cargo and built-in static analysis, while noting current limitations in microcontroller support, IDE tooling, and certified stacks like BLE.

  • The Pragmatic Embedded Podcast · 58m

    Modern C++ for Embedded with Niall Cooling

    Niall Cooling, director at Feabhas, explains how modern C++ (C++11 through C++23) enables safer, more agile embedded development by replacing C-style practices with compiler-enforced safety and modern tooling. He highlights 'quick wins' like `auto`, `constexpr`, and guaranteed copy elision, which improve code readability and performance without sacrificing the efficiency of C. Cooling argues that the true value of C++ lies in its ecosystem of header-only testing frameworks (like Doctest and Catch2), static analysis tools (Clang-tidy), and CI/CD integration, which allow teams to adopt Agile practices like Test-Driven Development (TDD) even in deeply embedded, safety-critical contexts. He contrasts this with the steep learning curve of Rust and emphasizes that successful adoption requires significant investment in training and process improvement rather than just language syntax changes.

  • The Pragmatic Embedded Podcast · 39m

    Christmas Special

    Hosts Jeff Gable and Luca share war stories from their careers in embedded systems, highlighting the pain of manual testing in helicopter avionics, the chaos of managing requirements with Word and Excel in Dropbox for medical devices, and the technical debt of massive #ifdef blocks in legacy machine tool software. They discuss the industry's slow adoption of modern software practices like version control and CI/CD, contrasting embedded development with web development standards. The episode concludes with book recommendations including 'The Phoenix Project' and 'Team Topologies', and reflections on the future of IoT security and agile adoption in hardware.

  • The Pragmatic Embedded Podcast · 48m

    Fuzzing and Dynamic Analysis for High-Integrity Software with Paul Butcher

    Paul Butcher, Unit Director of Dynamic Analysis at AdaCore, explains how dynamic analysis techniques like fuzzing find corner-case bugs that traditional unit testing misses in high-integrity software. He details the mechanics of fuzzing, including mutation engines and anomaly detection, and discusses challenges with timing and concurrency in embedded systems, citing success with the NH90 avionics MIL bus. Butcher also describes combining static analysis with targeted fuzzing to automatically triage false positives and generate reproducers, while touching on formal verification using SPARK for the London Underground's Victoria line and the cautious role of LLMs in verification workflows.

The summary, chapters and topics are generated from the episode’s audio by this directory, not written by Embedded.fm. The episode itself belongs to its publisher.