Why do engineers (love to) hate Arduino?

Engineers love or hate Arduino, but why?

why engineers hate arduino

A couple of months ago podcast I listen to interviewed an embedded engineer. Eventually, the topic of Arduino came up, and all three people on the show let of sighs of disgust. This lead to me to start thinking about why do engineers hate Arduino?

On this particular show, they said Arduino had too many abstraction layers to be useful. All three members of the panel agreed that direct hardware access was critical to success in embedded designs.

On the same episode, the same people talking, the topic changed to using a new chip or sensor. Then this comment was made: “I won’t design for a chip with no high-level software API and detailed examples.” (I’m paraphrasing to protect the innocent.) Everyone on the episode agreed.

Wow. Just what is Arduino then? One view is that it’s a well-documented board, with a high-level API, and lots of detailed examples. But somehow, these features on other platforms is desirable? So why do did these engineers hate Arduino so much when it is what they said every vendor should offer?

Are they haters? Are they trolls? Or are they just engineers who show a behavior common to humans. Let’s take a look at why engineers hate Arduino using other examples and concepts from psychology.

1. It’s too Easy

Recently I got to see three of the Arduino co-founders speak at Berkeley. One of my favorite quotes was from Tom Igoe:

And this is where most engineers, especially embedded engineers, take umbrage with Arduino. It makes the world of electronics and microcontrollers ridiculously simple to access. Of course, you might be thinking, but isn’t that a good thing? And if you ask those same engineers they would likely agree.

Arduino-hatred is hardly the first example of experienced engineers disliking non-technical users as a field expands.

Remember AOL?

One of the passages that resonated with me in Walter Isaacson’s book “Innovators” (my review here) revolved around when AOL users started using the Internet.

Veterans of the Internet and fledgling World Wide Web were disgusted by the flood of uninvited users. These new users didn’t understand proper etiquette, they asked ridiculous questions, and most of them didn’t even know what an IP Address was!

Here’s what I find interesting. Do people whose first access to the internet is a smartphone, know any more or less than AOL users did back in 1993? Probably not. And there is a lot more of them. We don’t see as much backlash against these neophyte users today.

Analog vs Digital

On Episode #103 of The Engineering Commons Podcast, the team interviews Dave Vandenbout. Dave gave a recount of his experience when digital electronics engineering was in its infancy. He recalls that “analog engineers” (were there others at the time?) referred to the digital engineers as “digital dingbats.”

Why? One of the reasons is that digital engineers, especially new-to-electronics digital engineers, didn’t have the base of knowledge the “old-hat” analog guys had. From the experienced engineer’s point of view, these darn kids don’t understand the details of hooking up 7400LS chips together!

And you know what, those darn kids didn’t need to understand 20 years of analog design to make the AND-gates work. Of course, being able to dig deeper is critical when circuits “don’t work” but that’s a topic for another rant.

2. It isn’t ideal (for everything)

When you have a hammer, everything looks like a nail. Many Arduino users aren’t looking for the ideal solution. They are happy hammering a screw into the wall if it solves their problem.

Most people are familiar with the concept of confirmation bias. (In America it becomes the lifeblood of social media during election times!) In short, confirmation bias is focusing on elements that support a preconception.

An example I experienced was when I wrote about the performance difference between digitalWrite and direct port manipulation. The actual point of the article was to show how to make measurements on a Logic Analyzer. One Twitter (ex-)follower responded un-politely about Arduino users, stating they couldn’t see past the “horrible and garbage API.”

There is an element of truth there. Some users cannot see past the API. They’re new. Of course, they can’t. Not yet! In this case, the rude Twitter comment was someone who used confirmation bias, digitalWrite is slow, to support their negativity.

Here’s the thing, though, if digitalWrite() works, it is perfectly acceptable to use it as-is. As Donald Knuth said,

“…premature optimization is the root of all evil (or at least most of it)…”

In other words, even if a solution isn’t optimal to a problem, it may not be necessary to “optimize” to a better one.

3. It’s too popular

People love to hate popularity, which leads to Kathy Sierra’s idea of the Kool-Aid Point.

Physics of Passion

Physics of Passion

Sierra is a developer that taught Javascript-based classes. Javascript is another technology engineers, software engineers, love to hate. Sierra makes the point that the existence of a passionate group means you also create passionate haters (she says “detractors.”)

This concept isn’t some new-age touchy-feely idea. It is how humans behave. Humanity naturally polarize around almost any idea or object.

Nothing makes everyone happy.

Her point boils down to the idea if a group hates you, then you’re doing it right. But what about engineers? Surely engineers are logical people who only make rational evaluations. Logically, they would never hate something that has positive attributes, right?

And so, part of why engineers hate Arduino is that it is the popular thing to love or hate. I’m sure programming languages, smartphones, operating systems, and cars are immune from this effect.

Don’t feed the haters

When you meet someone who demonstrates the behaviors outlined in this post, you might wonder what you should do. If that person is unable to revise their beliefs based on the new evidence being presented to them, they suffer from conservative bias. It’s probably better to just let things go.

Otherwise, you are going to find yourself in the middle of a full-force flame war. The irony? Both you and the other party will think each other are trolls. And in a way, you both are trolls.

You have both drank Kathy Sierra’s Kool-Aid.

Long comments, URLs, and code tend to get flagged for spam moderation. No need to resubmit.

Leave a comment

20 thoughts on “Why do engineers (love to) hate Arduino?

  1. I probably embody the whole love/hate thing in one person, and have spent a LOT of time working with Arduinos and thinking about this. I can’t speak to a lot of the “irrational” hate that you point out, but I think I can trace where a lot of the genuine problems come from: The Arduino IDE, and their focus on Pedagogy. (What people call the “Too many layers of abstraction” issue comes from here.)

    In general, the Arduino hardware is very nice. Well built, no major flaws, easy to work with and quite hardy. Unfortunately the IDE is a mess, and barely fit-for-purpose. They forgot Einstein’s maxim “Things should be as simple as possible, but no simpler.” Things are better now, in some ways, but also worse in others, because they’re addressing (at a very late stage) issues they really should have thought about back in the beginning, like libraries.

    Basically, the Arduino IDE was never designed for programs longer than about 100 lines. It doesn’t even _show_ line numbers unless you turn that on. It’s library management is awful. What that means is you have a nice easy learning curve for the first few months, and then you hit a wall.

    The digitalWrite() function pretty much encapsulates the whole issue. It’s easy, it’s slow, and using it increases binary sizes far more than is reasonable. Everyone knows it. Every “major” project (Marlin, GRBL, etc) ends up writing their own macros out of sheer necessity, and so instead of “simplifying” the environment you end up with some code using the functions, some using the macros, and the extra complexity of the interactions between them. Code isn’t portable between projects. It’s insane.

    People can’t “graduate” from Easy Arduino to Advanced Arduino without basically falling off the learning curve, and having to start over on a new one, wasting all their time and effort up until that point. “Oh, it’s just a learning experience, we didn’t expect you to do anything _serious_ with it” is another way of saying “We sell crap to kids because they don’t know any better.” and that’s when I start grinding my teeth.

    Another example: You can’t use the IDE to upload binaries. Again, that’s fine if you assume you’re only dealing with 100-line programs hacked together in an afternoon, or copypasta’d from the Arduino Playground (and “playground” is an excellent description) but when you’re trying to distribute firmware intended to drive 3D printers (like Marlin) that’s simply not good enough. People’s safety depends on that firmware. Forcing everyone to recompile it from scratch (instead of an “App store” with binaries) means they’re at the mercy of whatever API or library changes happened that week. Critical timing loops are vulnerable.

    A lot of people’s first experience with the IDE isn’t in the classroom, it’s trying to download and install existing projects to the hardware they bought just for that purpose. And the forums are full of suffering people who can’t get it to work. There’s no dependency tree that can pull in the right libraries for each project, there’s no ability to have multiple versions of a library installed for different projects.

    If the IDE had a way to build binaries for a set of common targets, it would vastly improve the process of distributing software (and all the effort people have put in) as well as give devs confidence their code is actually going to work cross-platform. That’s the messy truth of software development, and ignoring it doesn’t make it go away.

    There was a major issue not long ago because the API used to use the digitalWrite() function to set the pullup state if the pinMode() was set to INPUT, because someone thought that would be “easier”. But by overloading that function with a semantically inappropriate side-effect, they created a situation where they can’t even issue compiler warnings after the API change to indicate they just broke your code, because you originally did it the way they told you.

    There’s no directory structure in projects that encourages re-use (yet). You can’t even write libraries FOR their IDE, USING their IDE.

    It’s bad software engineering. It’s bad computer science. It’s a denial of the realities of what it takes to build stable systems, not compared to the “olden days”, but modern best practice. Kids are being led down the garden path to the “Playground” and then left there, and then the rest of us have to pick up the pieces when they want to start contributing to important projects.

    That’s my issue, anyway. But it is nice hardware.

    • You might have provided the most articulated response I have ever had on this subject. (My post was the result of multiple discussions with people.) I appreciate you taking the time to respond. And I apologize it got caught in the spam filter! It is the longest comment anyone has ever posted here… 😉

  2. I see it the same way as fixing my own car. I’m not a professional mechanic but that doesn’t stop me from learning to do relatively simple stuff on my own. That doesn’t mean I’m capable of fixing any problem on any car.

    I am a hardware/firmware engineer who doesn’t see these platforms as a threat, and neither do any of the hardware or firmware folks here where I work. Some people may feel threatened, meh…I’m not sure that it’s as big an issue as it’s made out to be here.

    Platforms like arduinos are great to leverage for certain purposes such as a quick prototype, a debug board to test a product with, a proof of concept or a even a personal DIY doodad not for commercial use. But that doesn’t mean Arduino is a solution to every problem. A bunch of things have to be considered to make a product usable (that’s what’s learnt in school), and Arduino may not have the right mix of features for a product design. Lord knows there’s a lot of easy-to-use platforms to choose from nowadays (think Beaglebone or ESP32) that have a different mix.

    I like the Arduinos of this world because they force all the other chip manufacturers to invest resources in developing a richer and more accessible development ecosystem for their own eval boards…the bar has been raised, we all win.

  3. I have a PhD in Electronics Engineering from Georgia Tech. I work extensively on wearable electronics (analog and digital) and have worked with Arduino systems as well as other embedded systems that are more difficult to use. For most devices we develop, Arduino just does not cut it. The DIY tricks and instructions that are widely avaliable also do not cut it at for the circuits we design. Arduino systems consume a lot of power and do not have enough processing capabilities. So yes, I am not too fond of Arduinos for my own development purposes.

  4. I think the short answer is it took a 4 year degree and work experience to learn embedded systems in the “old” days which were not that long ago. Now with high speed (non-dialup) internet and arduino and some brains a 12yr old kid can do what engineers can do. So now a steep learning curve has now gone away.

    Just a hard pill to swallow for degreed engineers.

    Of course all that learning/experience is never wasted. Just trying to make a point.

  5. Because its not command line based programming but interpreted programming. Which mean Arduino is no good if you want to get into computer programming. Thus I think the dislike (or hate if you will) probably steams from there for most part. But if you want learn to program some hardware so objects can move around (although you could learn stop-motion animation to do that but thats another story). It might be good starting point. But I have heard there are lot of bugs in Arduino that the creators have ignored which makes Arduino more frustrating to use than its probably needs to be. IF the creators of Arduino had any respect for its user they should actually sit down and work through every possible bug.

    • You are clearly misinformed. You should read my list of Arduino Myths first.

      Because its not command line based programming but interpreted programming.

      This is absolutely false. The Arduino library is a C++ library. It is not, by any means, interpreted. It is compiled C-code. The Arduino library provides some nice functions to make working with the hardware simpler for the user. All of those functions are pure C/C++ code which is compiled. This type of functionality is absolutely no different than when a vendor provides an SDK or sample code to use their hardware.

      Arduino is no good if you want to get into computer programming.

      It depends on you definition of “computer programming.” If you want to program complex multiuser systems or web applications, then no, Arduino is a horrible entry point. If, on the other hand, you learn to do hardware-focused embedded programming it can be a very good starting point.

      I have heard there are lot of bugs in Arduino that the creators have ignored

      Another falsehood. There is a very active development team for the Arduino library. If you look at the issue list on the Arduino GitHub project, you will see that bugs are being address where possible. This notion that bugs are being ignored is absolutely ridiculously and 100% false.

      Please stop spreading your misinformation as fact.

      • 1. something might have lost in translation there, what I indented to say was when you upload the source code in arduino, it run directly. while in RPI you will have create the execute file first, and you cannot run it until you have completely debugged everything.

        2. Of course i was think of software programming, but it wouldn’t surprise me that general public thinks of computer programming as software programming exclusive.

        3. hum, but unfortunately you don’t find that GitHub link on the main arduino website, of course when selling a product, you cannot admit on your main page, that there is fault with your product. Because that would be bad business practice.
        What I was actually referring to was this “…it’s the lack of professionalism of the Arduino creators.” this what Martin said back in September last year.
        Credibility can be ruined in various ways, but i know Martin is not talking about the main arduino website. One little example on how credibility can be lost is if you don’t make it crystal clear who wrote said code example in the learning sections or that particular additional library. I have seen in some of those learning sections that they ask for corrections or suggestions on the forum which quickly makes you wonder if they actually peer review those codes or libraries before they publish them. If they do there is no reason to ask for correction or suggestion as everything should be properly functional. If they do, then there is no need to confuse the reader about it, and if they don’t at least they could admit they don’t peer review those codes or/and libraries so there shouldn’t be no surprise for the reader if he try using those code examples or/and libraries if they end up not working.
        If they support community and encore regular user to add codes or libraries for public to use, they should be clear that these are not coming from them and that they take no responsibility if those are not compatible with arduino. If they don’t then they are making themselves the guilty party if things end up not working properly, and then whole arduino project can quickly become as unreadable as wikipedia.
        Now I don’t know about the production history behind arduino but if each new release of arduino is rushed to the market it can easily get riddled with unnecessary bugs and problems.
        There is great quote by one of the greatest gaming developers of all-time “A delayed game is eventually good, but a rushed game is forever bad.” I don’t know if this particular quote applies to arduino but its worth thinking about if we apply the meaning of it to arduino all though we should know arduino is not a video game.

        • what I indented to say was when you upload the source code in arduino, it run directly. while in RPI you will have create the execute file first, and you cannot run it until you have completely debugged everything

          This makes absolutely no sense and is 100% false. Arduino is compiled code. Raspberry Pi can be compiled code or it can be a script. It’s a PC running Linux. I have absolutely no clue what you mean by “you cannot run it until you have completely debugged everything.” That’s just more of your trolling nonsense.

          but unfortunately you don’t find that GitHub link on the main arduino website

          So? The vast majority of people who go there just want to download the software and make their project work. In the forums there is a section called “Suggestions for the Arduino Project.” And inside of there is a link to the Github project.

          you cannot admit on your main page, that there is fault with your product.

          More of your trolling. The very first forum in the Forum link said “For problems with Arduino itself.” This claim you can’t “show faults” is utter bullshit.

          Please take your bullshit elsewhere.

  6. It’s not hate of Arduino, it’s the lack of professionalism of the Arduino creators.

    They say it is made for hobbyists, tinkerers, … but the shield connectors are not in a 0.1″ grid which makes them incompatible to commonly available breadboards.

    Why does the IDE automatically include “arduino.h” instead of teaching people to do that themselves at the start of a source file? This also prevents some “hacks” where you do not want “arduino.h” included.

    The IDE should start the compiler with maximum warning level (-std=c++11 -Wall -pedantic) and with warning-is-error compiler option (-Werror). This is a simple tool which prevents lots of mistakes. I don’t understand why people are not using it.

    Why did the ports have to be numbered and in such an awful way? What do you gain by using numbers instead of port name and pin number like B3? Pretty much everything that can be done using numbers can also be done using port/pin pairs. It would also be easier to mix low level code like directly accessing code with high level arduino library functions.

    It’s annoying that everybody has to stamp “arduino” onto everything. For example your post “5 Common Arduino Programming Mistakes” is also good advice to people programming other things, but since it is realted to Arduino that’s OK. But what’s really annoying is to find “Arduino compatible resistors” on Ebay.

    And finally the Arduino-versus-Arduino war… a very questionable thing which tells me keep the fingers away of it.

    Too bad these things can’t be fixed anymore. I would have been a very nice platform for everybody, from beginner to wizard.

  7. Hei i just found your blog after watching your talk about capacitors and it was a very interesting watch! (i’m a software engineer but i love electronics and have a special interest in embeded systems)

    Anyway, regarding the topic on this post, i do completely agree with your point of view and i just can´t understand the reason why engineers love or hate the arduino and other products. It makes no sense.

    In my point of view, these are tools and i’ll use whatever makes my life easier. Sure, i do love my ARM Cortex’s but if i can make the same job in half the time on an arduino, i’ll gladly use it.
    It’s like all those flamewars about linux being better then windows and vise versa… Operating systems are also tools and as such some are better at some things and others are better at other things. i use both and i love both.

    My only real complain about the arduino environment is that sometimes it feels like i never “learn” anything. For example, a few days ago i used a arduino for testing a OLED display from ebay. I had never done this before and yet it took me around less then 10 minutes to connect the display, download an example, install the needed libraries and presto, a working OLED display. I didn´t even touch a single line of code or read it for that matter…

    Sure, i could do the same on my Tiva-C Launchpad but i would either need to find a library already made (not so easy sometimes) or make my own which coud take a few evenings just to get the same result.

    Best regards,
    nippius

  8. I’ve been playing around with some small electronic projects after a break of thirty years and the availability of microcontrollers like the Arduinos makes projects that would previously have been very complicated simple to implement.
    I use a microcontroller for even very straightforward applications with only a couple of inputs/outputs because they are so cheap. I recently bought some Arduino nano clones from China for £2 each. This makes the hardware incredibly cheap and half the fun is playing with the software and thinking of new and improved ways of controlling the hardware.

  9. Good post James. I’m a retired engineer, I don’t do it for a living any more, but I still enjoy the creative process.
    I am also a photographer and I remember having photos rejected because they were “digital” instead of film.
    I was an engineer before the advent of the microprocessor. The old school digital circuit designers scoffed at those also. We had a project that my boss, an old school guy, was lead on. After five or six pages of schematics of discrete logic circuits he got stuck. I showed him how to accomplish the task with an 8 bit 8080 and some assembly code.
    I became project lead and the project was finished and worked without a hitch. I’ve done scores of highly technical embedded processing projects, written my own compilers, interpreters, RTOS implementations and been as close to the bare metal as you can get. I use Arduino because it allows me to quickly and relatively easily prototype a system idea and get it running. Many times the prototype is very close to the final implementation. Every project is different
    and you don’t need an RTOS or a complex toolchain for every project. Once you have that depth of knowledge it is yours as long as you live. Letting someone learn a simpler way doesn’t diminish it. There is no threat from Arduino.
    Really, there is nothing to fear, so there is nothing to hate. Imagine.

  10. Oh yes, on another note, I recently noticed Arduino experience listed as a requirement in a job add. That tells me something (bad) about the company…

    • Really? I see it is a positive. It’s a way to identify someone who enjoys working with electronics and experimenting on their own. Of course, it depends on the specific job.

  11. Interesting article. I have to admit that I was one of the haters, initially – but I have since matured. :o) To an engineer it does feel too easy, and being use to being in full control at first it did feel very limiting. However, there are times when all you need is to get something up and running quickly and its is great for that – yes even for an engineer. I think many engineers don’t like the notion that everything is easy, there is a big difference between an Arduino prototype and a production product. It does seem to create the perception that anyone can put together anything and its easy – what do we need engineers for? Companies with this conviction will learn the hard way, but that’s what makes engineers angry and hate it – I think. On the other hand, if it gets more youngsters (and older folk) into electronics – then why not?

    Everything does not have to be hard and sometimes we need to look past the hard stuff and how we think we’ll do it to the actual idea. I think sometimes good ideas get shelved just because it looks to hard. If Arduino brings a new generation of innovators with new ideas who naively (maybe) see past the hard stuff – that will be good for us all…

  12. Another good post James. I’m not sure I’m an Arduino acolyte but I am happy to use it for lots of my designs and prototyping. For the stuff I’ve used it for, stepper motors, sensors, simple servos I’ve had lots of success with the Arduino.
    I am inclined to dislike the Arduino Yún which I spent a long project working with, that does seem to be a bit of a frankenboard and does not have any strong use case in my opinion. However the Uno and Leonardo are great and I’ve also worked with a Pro Micro clone which I’m happy with. Trinket has is peculiarities but again was just the job for my Christmas project.
    My main gripe which is related to the popularity is that there are a good few examples of shoddy code. Also because some of the libraries are trying to be a jack of all trades solution they can be a bit resource hungry.
    Not tried the newer more powerful Arm boards yet but the MKR1000 is on my radar as something to check out.