{"id":16026,"date":"2025-09-16T12:34:34","date_gmt":"2025-09-16T03:34:34","guid":{"rendered":"https:\/\/www.btc-embedded.jp\/?p=16026"},"modified":"2025-09-16T20:00:58","modified_gmt":"2025-09-16T11:00:58","slug":"solving-the-it-works-on-my-machine-problem","status":"publish","type":"post","link":"https:\/\/www.btc-embedded.jp\/ja\/solving-the-it-works-on-my-machine-problem\/","title":{"rendered":"Solving the \u201cIt Works On My Machine\u201d Problem"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"16026\" class=\"elementor elementor-16026\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-77cb599 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"77cb599\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-07f9305\" data-id=\"07f9305\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-d0ed23c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d0ed23c\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-4d98508\" data-id=\"4d98508\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c0cad36 elementor-widget elementor-widget-text-editor\" data-id=\"c0cad36\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.20.0 - 26-03-2024 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<p>If you\u2019ve ever tested software and had to report an unexpected problem back to the developer, then you\u2019ve probably heard this frustrated exclamation at least once:<\/p><p>\u201cBut it works on my machine!\u201d<\/p><p>What does this mean? Why is it a problem? More importantly, how can we help avoid future repeats of this frustrating phrase? In this article we\u2019ll explore these questions and more. So, hold on to your mouse and keyboard, and let\u2019s explore the world of personalized machines!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-c174855\" data-id=\"c174855\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7adea9c elementor-widget elementor-widget-image\" data-id=\"7adea9c\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.20.0 - 26-03-2024 *\/\n.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=\".svg\"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}<\/style>\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"726\" src=\"https:\/\/www.btc-embedded.jp\/wp-content\/uploads\/2025\/09\/aarn-giri-F40UHzCHk90-unsplash-scaled.webp\" class=\"attachment-large size-large wp-image-16032\" alt=\"\" srcset=\"https:\/\/www.btc-embedded.jp\/wp-content\/uploads\/2025\/09\/aarn-giri-F40UHzCHk90-unsplash-scaled.webp 2560w, https:\/\/www.btc-embedded.jp\/wp-content\/uploads\/2025\/09\/aarn-giri-F40UHzCHk90-unsplash-768x696.webp 768w, https:\/\/www.btc-embedded.jp\/wp-content\/uploads\/2025\/09\/aarn-giri-F40UHzCHk90-unsplash-1536x1393.webp 1536w, https:\/\/www.btc-embedded.jp\/wp-content\/uploads\/2025\/09\/aarn-giri-F40UHzCHk90-unsplash-2048x1857.webp 2048w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-92248a9 elementor-widget elementor-widget-heading\" data-id=\"92248a9\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.20.0 - 26-03-2024 *\/\n.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}<\/style><h2 class=\"elementor-heading-title elementor-size-default\">Where are we and how did we get here?<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-04a5cfc elementor-widget elementor-widget-text-editor\" data-id=\"04a5cfc\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>As recently as 50 years ago, when someone talked about a computer, they meant a whole room dedicated to diodes, transistors, capacitors, and a whole variety of rainbow-colored cables. Most companies couldn\u2019t afford <em>one<\/em>, let alone multiple. These machines only had one user at a time, and had to be shared between dozens, sometimes hundreds of users, and programming on them was slow and tedious (raise your hand if you remember using punch cards). Users and coders alike never had to worry about something \u2018only\u2019 working on their machine, because for all practical intents and purposes, \u2018their machine\u2019 was the only one they would ever see.<\/p><p>Fast forward to 1979, when two important developments first coincided: the Apple II, a small portable computer, had been available for a few years, and a new software program called \u2018VisiCalc\u2019 caught the eyes of businessmen. In fact, VisiCalc proved so invaluable for managing the often-tedious job of manually writing and updating spreadsheets, that many companies used it to justify completely dropping all their old technologies and buying an Apple II, just to be able to access the spreadsheeting software. Within just a few years, somewhere between a few hundred thousand to up to a million PCs were on the market and running VisiCalc. The entire business ecosystem had completely changed.<\/p><p>Keep going to the present, and the situation, while more complex, is still fundamentally the same. Sure, our computers can run more than just a simple spreadsheet program, and our graphics are a lot more powerful (take a look at any recently developed video game if you doubt me), but for the most part people expect a one-to-one mapping between machines and users. A user for every machine, and a machine for every user. I don\u2019t have to stop working on my latest blog article if my coworker down the row wants to send an email, and vice versa. The system is affordable, powerful, and convenient. What\u2019s not to love?<\/p><p>Well, the introduction of personal computers led to an unexpected problem, one which continues to cost countless hours and dollars of lost productivity, product defects, and delayed timelines: the \u201cit works on my machine\u201d dilemma.<\/p><p>Before, programs only ever had to run on a single computer. Now, they have to run on dozens, hundreds, thousands, even millions. And the situation isn\u2019t even as simple as designing code that\u2019s cross-platform compatible with different hardware. My environment consists of various stacks of software which, in theory, are isolated. But in practice, a totally different program running on the same box can break registry values, overwrite environment variables, corrupt memory, and wreak all sorts of other havoc. Guaranteeing software works <em>consistently<\/em> (let alone correctly) can become a nightmare, and except for some of the most rigorously developed and tested code, is effectively off the table.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f45b313 elementor-widget elementor-widget-heading\" data-id=\"f45b313\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">A Personal Example<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cd8e65e elementor-widget elementor-widget-text-editor\" data-id=\"cd8e65e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>In my role as an application engineer at BTC, I\u2019ve had to deal with the \u201cworks on my machine\u201d problem more than most. I\u2019ve worked with countless people who had to deal with failing CI pipelines, broken model simulations, and inconsistent test results that simply went away as soon as someone else followed the exact same steps they had taken.\u00a0<\/p><p>Perhaps the most dramatic example I\u2019ve worked with, and one that will make my point clear, was related to a CI pipeline at one of my clients. They were testing a series of models, and (seemingly at random), their pipeline would throw a Java error and crash <em>on a different model<\/em> almost every time they ran it.<\/p><p>I started the case by making sure to clean up anything in his environment that might have been causing issues. We went through the registry, and also deleted any temp folders on his computer, but the issue was still popping up. I tried downloading the exact same versions of all the tools he was using, and even ran his pipeline script on my computer, but I still couldn\u2019t reproduce the issue. After many hours of technical debugging, we decided that, besides his computer being cursed, the issue was simply worth too much hassle to try to track down, and we developed a workaround solution that quickly resolved all the issues and brought the pipeline back online.<\/p><p>Was there anything that this client could have done to prevent these issues? Hindsight is always 20\/20, and maybe he simply got unlucky with his machine. Still, there was one thing he could have done that would have made something like this far less likely to occur in the first place\u2026<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-855523e elementor-widget elementor-widget-heading\" data-id=\"855523e\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Introducing Docker<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-a8b9dd3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a8b9dd3\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-2657027\" data-id=\"2657027\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8e82a3b elementor-widget elementor-widget-text-editor\" data-id=\"8e82a3b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>You might have heard of <a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a>. It\u2019s been all the rage amongst DevOps ever since it was first publicly released in 2013. But what is Docker? What makes it so useful? And how does it help solve the \u201cit works on my machine\u201d problem?<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-inner-column elementor-element elementor-element-14bea5f\" data-id=\"14bea5f\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-17b2f56 elementor-widget elementor-widget-image\" data-id=\"17b2f56\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"320\" height=\"121\" src=\"https:\/\/www.btc-embedded.jp\/wp-content\/uploads\/2025\/09\/docker-inc-logo-png_seeklogo-275084-e1758019779979.webp\" class=\"attachment-large size-large wp-image-16034\" alt=\"It Works On My Machine\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-56792ec elementor-widget elementor-widget-text-editor\" data-id=\"56792ec\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\tDocker is an OS-level virtualization engine that lets you package, deploy, and run isolated containers. That\u2019s a lot of jargon! Let\u2019s break it down a little before we continue:<p>\n<ol>\n \t<li><strong>OS-level:<\/strong> In older computers (think <em>really<\/em> old, like \u201cthis-computer-takes-up-a-whole-room\u201d old), you would only ever run one program at a time. This meant that the program was fully responsible for <em>everything<\/em> the hardware did. Mouse and keyboard? The program needs to implement device-specific IO keylogging, buffer, and translate the results into an action that corresponds to what you actually want to do. Graphics display? Any output had to be written directly by the program to the screen (if there even was one), or somehow printed out and made available. This was before the era of drivers, graphics engines, or even dedicated GPUs. The result was that even a very simple program had to implement a bunch of tedious and hard-to-maintain code that ended up being really similar to what other programs were implementing, because they were controlling the same device. Plus, the code wasn\u2019t very efficient or optimized, since it wasn\u2019t related to the program\u2019s \u2018particular\u2019 functionality. And, if the user wanted to run a different program &#8211; even for just one minute to do something on the side &#8211; they would have to completely shut down the computer and swap out the program floppy disk for a different one. To get around these difficulties, computer engineers quickly realized the need to develop an \u2018operating system,\u2019 or OS. This was code that ran directly on the hardware (just like before), but instead of \u2018doing\u2019 anything, it provided a common environment that could be shared by multiple programs. This way, rather than an excel spreadsheet needing to read, buffer, process, and write keystrokes to a display, it could simply \u2018receive\u2019 input events, code only the relevant spreadsheet functionality, and \u2018send\u2019 output events to display results. Furthermore, because the OS was handling any common functionality to all programs, it became the \u2018main\u2019 program that the computer would run, and then it would \u2018spawn\u2019 multiple processes (programs), so that the user could switch between them at-will.<\/li>\n<\/ol><p>\n<ol start=\"2\">\n \t<li><strong>Virtualization:<\/strong> OSes were powerful. But a problem quickly began to rear its head. How could the user make sure Program A wasn\u2019t trying to maliciously tamper with the data that Program B was running? Clearly, even though all the programs were co-existing on the computer at the same time, some kind of cage had to be put into place around each program to make sure that it couldn\u2019t just break a different, unrelated program. From the program\u2019s perspective, it has to think it has sole, exclusive control of the machine when it&#8217;s running, as if it had all the memory and CPU for itself. The solution was for the OS to create \u2018virtual\u2019 hardware. The program, when reading and writing memory, or executing instructions, would run \u2018as if\u2019 it were accessing the actual memory and CPU. But the OS would intercept these actions and translate them into a unique section of memory, and make sure that any CPU results weren\u2019t overwritten by a computation running in a different program. This virtualization, where the program talks to the OS as if it were talking directly to real hardware instead, isolates code sets and prevents accidental or malicious cross-talk. Many advanced security exploits today try to break this virtualization, attempting to gain access to data that they shouldn\u2019t and run commands that take over the computer.<\/li><p>\n \t<li><strong>Engine:<\/strong> No, I\u2019m not talking about your car engine, although the notion is similar. In this case, an engine refers to a complex piece of software that \u2018runs\u2019 something. In Docker\u2019s case, it\u2019s a program that runs other programs. And just like how an engine requires a certain type of fuel, Docker has a special syntax, called a Dockerfile, that lets you specify how to \u2018drive\u2019 it, or how to get it to execute the programs you want in the way you want them to. Putting all of this together, we can talk more concretely about what Docker does. As an OS-level virtualization engine, Docker lets you specify and run programs (it calls these \u2018containers\u2019) by taking advantage of the virtualization software already present in the OS. In other words, Docker acts like a mini-OS on top of the local OS, to let you run programs without having them interfere (or be interfered with) by other programs.<\/li><p>\n<\/ol><p>\nWhat? Doesn\u2019t the OS already do this? What\u2019s the point in running Docker?\n<p>\nWell, in theory the OS separates out programs. In practice, people quickly realized that it\u2019s really useful to let programs talk to each other. Modern day OSes are complex ecosystems that, for practical purposes, enable quite a bit of cross-talk between programs. These are well-defined (a program will never be able to overwrite another program\u2019s memory, for instance!), but there\u2019s a lot of different ways one program could affect another program\u2019s functionality. Docker purifies your system by isolating your \u2018normal\u2019 workspace, including all of the overhead chatter, from your \u2018Docker\u2019 workspace, which dramatically minimizes the number of interactions you have to worry about. A typical computer will be running anywhere from 200 to upwards of 500+ background processes at a time, most of which are irrelevant to what you want to do at any given moment. Have you ever heard of crss.exe, for instance, and could you explain how that would impact some code you want to test? I couldn\u2019t. By enforcing strict isolation between these hundreds of processes and the handful of things you want to <em>actually<\/em> run, you cut down the number of possible interactions (and interaction-related bugs!) by 90% or more. This is the value-statement of Docker.\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c4fed2a elementor-widget elementor-widget-heading\" data-id=\"c4fed2a\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What is Docker useful for?<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-132ae24 elementor-widget elementor-widget-text-editor\" data-id=\"132ae24\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>So, now that we\u2019ve talked about <em>what<\/em> makes Docker useful\u2026 what is it useful <em>for?<\/em><\/p><p>Obviously, you don\u2019t want to run everything in Docker. Either you\u2019ll end up just duplicating your OS (and then what\u2019s the point?), or you\u2019ll break the ability of programs to talk to each other and lose out on critical functionality. Plus, you have to tell Docker exactly what you want it to run and how, and that can be time consuming and tedious. What\u2019s the sweet-spot that makes it worth the investment?<\/p><p>I started this article by talking about the \u2018it works on my machine\u2019 problem. Oftentimes, it\u2019s fine if something only works on my machine. Collaboration is often more about sharing results than the processes that got you there, and I\u2019m not going to be heartbroken if the script I made to process Excel data only works on my computer because, well, I\u2019m the only one who\u2019s ever going to run it.<\/p><p>But sometimes we don\u2019t just care about results. We care about consistent results and consistent processes, because we\u2019re expecting many people to interact with them, and want to make sure there\u2019s as few misunderstandings as possible. Today in Automotive, we often see that it takes teams of dozens, sometimes hundreds of people, just to create a single component of a vehicle. If we didn\u2019t have a way to ensure that information flowed smoothly, all the gears of this gloriously complex machine would immediately come to a halt. This is where Docker steps in.<\/p><p>Consider one of the most common development paradigms. I\u2019ve edited some existing code (or a Simulink model!), and I want to make sure that my changes haven\u2019t broken anything. My team has been hard at working testing our software as we develop it for months now, and we have a comprehensive test suite of hundreds (or maybe thousands) of tests that we can run to validate that my changes are good to merge into our active release branch. Rather than clogging up my machine with having to sit and execute these tests for hours (or even days), I push my changes to another computer, which spins up all my software and runs my tests on the cloud, so that I can continue working, getting the test results and any feedback as soon as they\u2019re ready. This is an extremely common use-case, and it often goes under the name of \u201cContinuous Integration\u201d or CI Automation.<\/p><p>Now, it would be awful if my CI pipeline either broke (oftentimes dozens of people are relying on the machine!) or gave inconsistent results (how can I debug something that I can\u2019t reproduce?). Generally, my development stack only consists of a handful of programs &#8211; a dev environment like MATLAB\/Simulink, test tool like <a href=\"https:\/\/www.btc-embedded.jp\/btc-embeddedplatform\/\">BTC EmbeddedPlatform<\/a>, and maybe some virtual simulators like dSPACE VEOS. I want these programs to communicate with each other, but I don\u2019t want anything else to get in the way! This is the perfect use case for Docker. By defining a simple Dockerfile, I can create a container which runs these programs (and only these programs), ensuring I have a consistent, reliable environment for my testing. Had my client from earlier been running Docker, perhaps he never would have had to deal with any of the inconsistent, impossible-to-reproduce results that necessitated an alternative solution in the first place. Docker takes you from \u201cit works on my machine\u201d to \u201cit works on all our machines!\u201d<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9981f67 elementor-widget elementor-widget-heading\" data-id=\"9981f67\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Conclusion<\/h2>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24f9e0e elementor-widget elementor-widget-text-editor\" data-id=\"24f9e0e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Modern tech stacks are incredibly complicated, and require interactions between hundreds of different programs. Oftentimes, however, we\u2019re only interested in a handful of programs at a time, and want to minimize any possible interference from the other hundreds of programs in order to produce consistent, reproducible results. Docker helps us all but guarantee this by curating a minimal environment containing only the code we\u2019re interested in, along with its dependencies. In Automotive, this ensures robust CI pipelines and pain-free test executions, making the \u201cbut it works on my machine!\u201d problem a thing of the past!<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>If you\u2019ve ever tested software and had to report an unexpected problem back to the developer, then you\u2019ve prob [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":16030,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[55,49,138,141,139],"product":[],"use_cases":[],"class_list":["post-16026","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-ci-cd","tag-model-based-development","tag-standard-tools","tag-test-driven-development","tag-testing"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/posts\/16026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/comments?post=16026"}],"version-history":[{"count":9,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/posts\/16026\/revisions"}],"predecessor-version":[{"id":16045,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/posts\/16026\/revisions\/16045"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/media\/16030"}],"wp:attachment":[{"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/media?parent=16026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/categories?post=16026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/tags?post=16026"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/product?post=16026"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.btc-embedded.jp\/ja\/wp-json\/wp\/v2\/use_cases?post=16026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}