Off the Shelf Rapid Prototyping

One of my interests over the last few years has been to move more into hardware. My first real job was working with robotics systems and I fell in love with hardware. It was magical to be able to push a button and make something move and know that I am the one that programmed the directions to tell that thing to move.

I have been trying to get some traction in this area, but there is big signal to noise ratio.

One problem I personally have is what I like to call “If you give a mouse a cookie.”

Push the button! Do it! I dare you!

Push the button! Do it! I dare you!

Basically, I get consumed with figuring out how everything works. I get an Arduino and rather than just building something with it, I get consumed by trying to figure out how it was designed, why the chip they used was selected, how does the chip work, what other chips are out there, how do you design a circuit board…

I have been trying to figure out why this derails me so quickly. I realized that I get ahead of myself.

When I am trying to make myself turn an LED on with a button, I feel like it’s not hard enough. Anyone can drop fifty bucks on an Arduino and some LEDs and resistors and do what I am doing. I feel that it’s valueless and that I need to find some way to add value to differentiate myself from everyone else.

That’s getting way ahead of the game.

If you get a group of programmers and engineers together and have them look at something cool, they immediately start thinking about how they can monetize it. We just do. It’s part of our DNA. We can’t just do something cool because it’s fun. Everything has to have a purpose. If you’re doing something cool, there must be a product somewhere in it and you have to figure out how to make something cool before someone else has the idea so you can cash out on it.

Then there are people with the exact opposite approach. They will take something that is really simple, but looks complicated and they will try to monetize it immediately. Sometimes they get lucky and can cash out on a fart app or something simple, but a lot of times you wind up with garbage products on the market that are basically a sensor connected to a Bluetooth connector that talks to a bare bones app.

I want to spend this coming year more fully exploring this space. I think there is a lot of potential out here, but there are a few things to navigate.

  • What would make a good product?
  • What do I need to know?
  • How do I order the things I need to know so I don’t focus on a thing I need in five years before the thing I need tomorrow?
  • How much off the shelf stuff can I use?

The off the shelf question is the part that prompted this blog post. This is a wonderful time to get involved with hardware hacking. Arduino has really opened up things to everyone by providing a consistent and well documented rapid prototyping system. Companies like Adafruit have built successful businesses around the Arduino form factor and programmable LEDs. I think these things are really cool, but they seem to be toys and learning materials rather than serious tools with which to build embedded products. It’s going to take a leap from tooling around with pretty light rings to figuring out an actual real world application.

The other off the shelf question I have is with not just hardware, but services as well.

I recently bought a developer kit for the Particle Photon. So far I am really impressed with this device. It’s connectivity is through Wi-Fi rather than Bluetooth LE. It has an online IDE from which you can flash devices remotely. It is set up with IFTTT so that you can use it to build your own Amazon Dash Button among other things.

This is really cool. You can get a lot of stuff up and running in just an hour. However, I would not feel comfortable using this as a basis for a product I would develop because it has a single point of failure, which is that the hardware only interacts with servers that are controlled by the Particle people. This makes it really easy to get something up and running, but that means that if Particle was ever bought by someone like Facebook, like they did with Parse, you’re at the mercy of a vital service that could be discontinued at any point in time.

It’s really cool to be able to use an off the shelf component to get up and running, but it’s also important at some point to move beyond it. An Arduino is a generically designed device that is supposed to work with a lot of different things. The Trinket from Adafruit and many other development boards are “cheap” but they are not specifically designed for your purposes. I think that I need to be better about embracing these off the shelf solutions so that I can get a better idea about what I want to do and how to get something working, but I also need to keep in mind that if I develop something with these off the shelf solutions, I need to avoid single points of failure. But right now my single point of failure is putting the cart before the horse and worrying about these problems before I am at that point.

I am going to try and be more relaxed about embracing these tools for what they are and use them to learn before over complicating things. Life is a marathon and not a race.

Learning From the Masters

Recently I joined Sector67, a hacker space in Madison. I have written on here about all of the various things I am interested in doing (robotics, electronics, etc…).

Every time I talk about wanting to learn a new skill, I keep hearing people tell me not to do tutorials but to choose a project and use it as a learning experience. I have written on here before about this, but there was some aspect of this argument that has always bothered me. I didn’t grasp it until I heard it from the organizer of the hacker space.

He told me that buying electronics kits were a waste of time because at the end of the kit you only knew how to construct the kit and nothing more.

That is the crux of the argument.

I feel that people have a fundamental misunderstanding about the learning process. People are under the impression that we are all computers, we can only do what we’re programmed to do. He and others are under the impression that doing a kit or a tutorial teaches you only what the purpose of the tutorial is and you get nothing beyond that.

I don’t feel that is true for me. It may or may not be true for others, but I don’t feel that is the case for me.

One thing that art students do is to recreate the works of the masters. It gives them a perspective of what was in the artist’s mind when they created great works of art. It may feel like you’re not being creative or implementing anything on your own, but getting a perspective on what has already been done and being exposed to various styles helps temper your own talents and perspectives. After you build up a base of skills and experiences you have much better tools to implement your own artistic vision.

You don’t start out making a great piece of art. You don’t start out writing an amazing app. You don’t start out building a nuclear reactor.

I get that a lot of people don’t do well with a formalized learning process. I certainly didn’t. They have memories of sitting through boring lectures about data structures without having any context about how that leads to writing efficient applications. I don’t think that is a fault of the formalized learning process, I think that is a fault of how that particular formalized learning process was applied.

I was speaking yesterday to a kid who wants to be a gaming tester who said that school bores him and he can only learn when he is actively engaged. We all learn better when actively engaged.

I don’t think there needs be a separation of formalized learning process and hacking. I think the two should work together.

I think the MAKE series of books and Ray Wenderlich’s tutorial series are great examples of formalized learning structures that are also interactive and incorporate the hacker mentality of doing useful things and seeing how they work.

When I do tutorials for iOS programming, it fleshes out my understanding of how the applications work. I see and absorb programming style. I also got a lot out of actually taking programming classes. My teacher Eric Knapp went over with us how to detect code smell. He had us write applications that repeated code and were structured badly and showed us how to write good, maintainable applications. I have met people with ten years of experience who don’t understand how to do this because they never had any formalized learning structure.

Having a lot of experience doesn’t necessarily correlate to being good at what you do. Thinking critically about how to approach a problem is necessary as well. Sometimes you can get a jump start on this by learning from other people’s mistakes. It’s important to make your own mistakes as well, but there is a place for building contrived projects that teach you how things work. You learn several building blocks and you infer that if A is true and B is true then C is true as well.

Every programmer starts out writing “Hello world!” You don’t jump from writing “Hello world” to writing a neural network. You have a lot of intermediary steps. You have to spend a lot of time figuring out what problems have already been solved so we can build upon the experience of others rather than reinventing the wheel over and over again.

Signal Flow and the Art of Motorcycle Maintenance

Last year I worked at a hardware company where our primary product was robotics and not software. This is an experience I don’t think most software developers get to have. Most of us are stuck writing esoteric applications communicating with a server or a cloud where you’re not programming something you can touch and feel.

When I was in school I never got to take any shop classes because they scheduled them opposite the college prep classes. My grandfather was a builder and I remember growing up wandering around building sites watching people pouring concrete. Even with that experience, I still had a mental block that working with hardware or power tools was something for other people.

I don’t think that working with your hands has to be divorced from working with your head. I think if you physically touch and see the things you are working with, it helps you think about what you are actually doing.

When I was going to school for audio engineering they made us write signal flow documents for how the sound travels from the microphone to the recording device. I found it incredibly frustrating because I just wanted to go and play with the sound board and I didn’t think it mattered about how things worked under the hood.

That experience really helped me a lot with programming. When I write a program I think through the signal flow of my code. I think about the sequence of events that happens when things are triggered. I don’t know if other people do this too. I know that I have trouble dealing with code where people ask me about something that happens in the middle of the signal flow. To me, it’s almost a narrative thing where a story happens between when the user interacts with the app, or it launches, or whatever the triggering event is and the events that happen afterwards.

I really want to do more with hardware. I find just working with software to be very existential. I feel like I am not doing anything. But I also know that I don’t have the requisite skills to do the things I want to do.

I have enough skills to have a good career as an iOS developer, but it isn’t just about money for me. I want to work on things I find emotionally fulfilling. People keep telling me that jobs are supposed to be soulless and boring, otherwise people would do things for free. I don’t think that’s the case. I think there are a lot of unexplored avenues with iOS that require specialized skills. I think that working with Bluetooth and micro controller devices has a lot of potential, but that requires knowing stuff besides Swift.

How I Learned Programming

I have been incredibly disorganized about trying to learn electronics. I bought a bunch of electronics kits partially to learn soldering. I have a good handle on soldering, but I didn’t do the stuff I intended by figuring out the signal flow of the projects I was working on.

I bought the Make: Electronics book, but I didn’t work through the projects while I read it. I was reading it in the bath tub and before bed, like I was reading my programming books.

I burned myself out reading technical books where you’re supposed to work through a project or look at code while you are working through it.

I know, but keep consciously forgetting, that code, like anything, is a skill. When I learned programming, I sat down between 60 and 80 hours a week working through the Big Nerd Ranch iOS book over and over again.

My teacher Eric Knapp told us that programming is like playing the piano. You need to practice a lot. The first time I typed a project in the book, it would make no sense. It would just be something that worked like magic. The second time I typed it, things wouldn’t be much different. By the third time, I would start to make mental connections about how the project worked. I was starting to form a signal flow document mentally about how an object I created in one place would pull information from another object and result in an output. By the fourth time I understood how the whole program would work.

One thing I had to get over was the idea that somehow doing a tutorial wasn’t really programming. I thought if I didn’t create the code in my head then I wasn’t really learning.

That isn’t the case at all.

It’s like practicing scales on the piano. If you do something over and over again and you do it a lot, your brain starts to make mental connections that it wouldn’t if you didn’t work with something a lot.

It’s like how if you play through Mario Brothers for the first time, you probably die in the first world. If you watch someone who’s been playing since 1987, you think they’re a genius because they know where the short cuts are and where they keep dying. They didn’t start out that way. Either they found them by playing it a lot or someone clued them into where the short cuts were.

How I Want to Learn Electronics

One thing I keep hearing from people is that you need a project to really learn something. I would agree to that to some extent. When I was trying to learn GLSL I didn’t make any progress until I found a project I wanted to do. I found a filter I wanted to write and it gave me enough focus to go in and write the code and add it to the framework.

However, I was only able to do that because I had enough of a base of knowledge about basic programming in order to do that. If I tried to jump in and write that shader before I wrote “Hello, World!” then I would have been hosed.

I think there are two levels of learning a new skill. There is the grunt work of learning the basics, like terminology and “signal flow”. You have to have a good grasp of these things before you can move on to doing your passion project.

I was trying to jump into my passion project without putting in the grunt work I put into learning programming. I have to work through a bunch of basic electronics projects like making an LED light up before I can design an analog synthesizer or a beacon to find my dog when she runs away.

I want to start the Make: Electronics book over again, but I want to do it properly. I have an electronics workshop in my basement, but like everything else in my life, it’s super disorganized.

I bought the component packs for that book. I want to organize my space and learn electronics the same way I learned programming. I want to set aside a decent amount of time and actually touch components and build things. I am not going to skip over the grunt work and “scales” of electronics because if you don’t build a good foundation of knowledge, you won’t get anywhere.

What I am Not Going to Do

I am going to stop trying to read programming and electronics books for fun. I felt guilty for the last few years doing anything that was not related to programming. I burned myself out and created a lot of frustration trying to force myself to learn in a way that was unnatural.

At RWDevCon, James Dempsey talked about the importance going away from keyboard. If I am not in front of my computer actively working on a programming project, I am not going to read a programming book or tutorial. I want to be fully away from the computer.

There is a Buddhist concept of ”Be Here Now”. Don’t worry about the past because you can’t change it and don’t worry about the future because it hasn’t happened yet. The only thing that is important is the moment that is happening right now. If you’re off the clock, be fully off the clock. Disengage. Don’t check Twitter and email. Don’t read programming books. Don’t feel guilty about not working.

I am hoping to document my progress on the blog. I am not going to be inventing the wheel here. I am doing my scales and working through my programming tutorials over and over again. It’s going to be some basic stuff and figuring out how everything works together. I want to get back to how I worked in my audio engineering classes by understanding my signal flow. You can’t build a castle on a swamp, and you can’t generate great innovations without a strong technical foundation.

Keep Calm and Solder On

I think it’s painfully obvious to anyone who comes here to read my blog that I have a lot of hobbies and interests. I consider myself something of a renaissance woman. Any time I see something cool or eat something interesting my brain starts ruminating about how I can make this thing myself.

I have slowly come to the realization that I will not be able to do all of the things that interest me before I die. I probably won’t be fluently bilingual, so sorry Julia, my friend in Austria who keeps wanting me to learn the Austrian dialect of the German. I am probably not going to get a black belt in some kind of martial art. Heck, at this point I am pleasantly surprised that I have taken up and enjoy running, considering that I spent the last year in bed with my pugs hiding from the cold and working from home.

My little electronics helper.

My little electronics helper.

One of my multitude of hobbies/interests is working with electronics. I have always been fascinated by electronics and one reason I really got into programming was because I was interested in telling a machine what to do. Electronics, like a lot of other things such as C, is something I have been told I don’t really need to understand to be a great programmer. Actually, I think the more accurate advice was I didn’t need to understand it to know enough programming to find a job. There is a difference.

I have discovered the longer I am working with computers that there is always a lower level than the one I am currently working at. I went into programming thinking C was the lowest you could go. Then I discovered assembly language (which no, I have not succumbed to yet). Now I am discovering electronics.

Electronics, like programming, has something of a learning curve. There are lots of little pieces and components like transistors and DIPs that can be rather daunting to the uninitiated. Additionally, at least with programming you are dealing with text. You can look at a computer program without knowing and programming language and at least recognize that this is something human readable. Look at a circuit board and all you see is the language that Superman’s people used on Krypton. To make things even harder, you can’t debug a circuit in the compiler like you can with a program. Your circuit either works or it doesn’t. These things are incredibly daunting, which is exactly why I am incredibly obsessed with this right now.

Yes, this looks scary. It is at first, but it gets better.

Yes, this looks scary. It is at first, but it gets better.

I am a masochist. If I get to a point where I feel proficient with something, I feel uncomfortable and uneasy. My brain starts overheating and spinning itself into butter, so I have to find something harder to throw at it to keep myself from having a panic attack. It’s hard having a balancing act of giving my brain enough to do that it doesn’t overwork itself over nothing as opposed to trying to do too much and cracking under the weight.

My current hobby to do in my free time right now is to work on learning electronics. I specifically would like to figure out how to build electronic instruments. I would like to design and build a modular synthesizer in the basement. Eventually I would like to apply the knowledge I have about that to a piece of software to eventually release, but right now I am trying to thread that needle between doing too much and not doing enough.

Do I need to understand electronics to be a great programmer? No. Will knowing electronics help me make more money in the future? Probably not. Could I spend my free time writing an app that could conceivably earn me more money and advance my career? Probably.

So why do this?

Here’s why:

  • Because it’s fun. I love doing things with my hands and I honestly find working on software to be a bit soulless sometimes. I feel like nothing I do is real because it exists in the ether. Holding a real, physical component and soldering them together is fulfilling in a way that software development just isn’t.
  • You know what all this crap does? Me neither. Let's find out.

    You know what all this crap does? Me neither. Let’s find out.

  • I work with robotics. I didn’t have to write the firmware or the interface software to deal with the robotics initially, but it bothers me that I don’t quite grok how we are talking to the robotics. I know enough about the code to deal with it, but on a conceptual level there is still a lot of magic black box voodoo that is happening that I don’t fully understand. I don’t like working with things that work without me understanding what they do. I don’t “need” to understand this stuff to do my job, but I would personally feel more comfortable if I worked through a robotics project on my own and have a mental model for what it is that we are doing.
  • I don’t like looking at a circuit board and not understanding how it works. I think a lot of people feel very uneasy around things like programming because they see something that isn’t familiar to them and it frightens them away. I know there has to be a way of understanding how a circuit board works because other people design and build them for a living. Our entire society is built on integrated circuits and I want to know how they work and how to design them.
  • My analog synth kit that I am saving until I feel more comfortable tackling something this complex.

    My analog synth kit that I am saving until I feel more comfortable tackling something this complex.

  • It’s never been easier to self teach yourself electronics. Arduino and Raspberry Pi have made working with electronics and programming affordable and accessible to nearly everyone. In the last three or four years the MAKE series from O’Reilly has produced books on wearable electronics, analog synthesizers, and sensors. Sites like AdaFruit make it possible to buy projects designed by other electronics hobbyists. I have received an analog synthesizer kit that I am looking forward to assembling in my basement. I bought conductive thread and smart LEDs so that I can create a wearable electronics project. I don’t have kids and I have disposable time and money. Instead of spending a day playing Nintendogs on my Nintendo DS, I can go to my basement and build a robot that I can spend another weekend hacking.

If you are interested in electronics, here is what I have done:

  • Go to O’Reilly and pick up books like this one or this one. O’Reilly has great deals on ebooks if you buy two or more of them. Many of the books in the MAKE series have correlating kits on Maker Shed, which are also somewhat available at Radio Shack, if you like brick and mortar stores. Just doing a kit is not going to teach you electronics, but it will get you comfortable with soldering and putting pieces together. The physical aspect of feeling comfortable touching and manipulating small parts is vitally important and I have personally found when I am trying to learn new things that just following directions and putting something together is a good first step to introduce you to something unfamiliar.
  • You're going to snip and solder a lot of these little bastards. Get used to it.

    You’re going to snip and solder a lot of these little bastards. Get used to it.

  • Invest in a good soldering iron. In fact, don’t stop at the soldering iron. Any time you buy tools, invest in good tools. You are going to be snipping a lot of wires and fighting with your snips when you are trying to make a nice, even back is no fun. It also bothers your wrists and for people coming from a programming background, that is never a good thing.
  • Practice soldering! I have done cross stitch for over two decades, so I personally found soldering to be somewhat easy to pick up. I am used to patiently sorting through threads and inserting thin filaments through holes. Let there be no ambiguity on this point: Working with your hands is a skill. You can cultivate a skill by using it a lot. Just because you may not have a preexisting aptitude for manipulating small pieces does not mean that you should give up on doing electronics. I suggest buying a bunch of small soldering kits from Maker Shed and that you just get comfortable with touching and soldering pieces. My first project was a noise maker that goes in an Altoid tin. There weren’t a lot of pieces and it wasn’t super complicated, but just the process of sorting the components and touching the pieces and trying to figure out how they worked together was an invaluable introduction to electronics that made me eager to learn more and to bigger projects.
  • Organize your parts!!

    Organize your parts!!

  • Organize your work space. This is the single most important piece of advice I can give to anyone undertaking a hobby with lots of small physical bits. Again, I have a background doing cross stitch. I never got a project done until I started learning to organize myself. I separate each color thread, put them on an index card, and I catalog what each color is. I make a slot for each color along with its symbol before I need them. I got relentlessly organized with my threads and my tools and once I did that I was able to get things done. Keep your space clean and organized. Take care of your tools. Buy as many parts bins as you need and label each and every drawer. If you can, have a dedicated space for your electronics. I have a table in the basement that has my soldering iron and my tools. The projects are all in one place and everything is tidy.
  • Be patient with yourself. You might have a natural aptitude for this or you might not. I have found a lot of things I thought I had no natural aptitude for that I was able to learn through tenacity and stubbornness. If you want to learn something because you want to learn it, then don’t worry about how long it takes. If you can accomplish something you thought was difficult after failing several times, just think about how awesome you will feel.

One of my projects was putting together an Arduino shield with a bunch of attachments to things like motors and sensors. I need to spend some time figuring out how to get the Arduino to talk to the board and to make it do things. I got past my initial skittishness around touching and putting together the components, now I need to take the next step of figuring out how to make them work together.

Again, this is a hobby I picked up a few months ago. I would like to spend a lot of time over the next year pushing the boundaries of what I can do with this. I will try to be better about writing up each of my projects on this blog in case anyone finds this interesting.

My "completed" Arduino shield I need to learn how to hack.

My “completed” Arduino shield I need to learn how to hack.

One reason I decided to do this was because someone told me I had to have an electrical engineering degree to understand how a circuit board works. I don’t believe that. I believe I can learn anything I want to. I think there are a multitude of sources available out there for people with the time and patience to work with them and who have a little bit of money to invest in their hobbies.

I also think there is value in learning how to do something just to do it. I spent a lot of time learning how to cross stitch because I wanted to know how to do it. So far I have not earned a dime from my textile work, but the things I did to discipline myself to learn it have come in handy down the road while learning programming.

I love the smell of solder in the morning. It smells like lead poisoning!

I love the smell of solder in the morning. It smells like lead poisoning!

Let’s pretend that you want to master making pie. Pie crust is hard to master. You need to develop a good feel for when the dough is too dry or it has been over mixed. My mom has spent forty years mastering how to make pie and she is still experimenting with different things. Mom doesn’t sell her pies and will never make money off of them, but the process of making them and the joy they bring people make it worth it to her to keep trying to make them better.

I think that there is a lot of pressure to spend all of our time doing things that will make money or bolster our careers. I think its important to spend some time cultivating those things, but I am also very Zen in that I think people should do things for no reason other than that it makes them happy. You can’t spend all of your time worrying about whether you are learning the right things. Sometimes you have to follow a passion and do something that makes you happy and not worry about what the future will bring.