Chocolate Covered Cherries

The following is a really bad metaphor, for which I apologize and will try to explain in better context later in this post:

Pretend you are walking down the street and you see a candy store on the corner. You weren’t really planning to get anything, but after you see the candy store you have an overwhelming desire to eat a chocolate covered cherry.

You impulsively decide to visit the candy store hoping they have chocolate covered cherries.

The man behind the counter greets you warmly and asks you what you want. You tell him you want a chocolate covered cherry. He says sorry, but they don’t have those today.

You’re kind of disappointed, so you thank him politely and turn to leave.

“We have vanilla cremes. Those are like chocolate covered cherries.”

You don’t want a vanilla creme. You wanted a chocolate covered cherry. You say sorry, but that you don’t want a vanilla creme.

“What about raspberry creme? That’s even closer to chocolate covered cherries.”

You politely but firmly tell the guy you don’t want a raspberry creme, you just want to leave.

“What about this hard sour cherry candy? Or this soft cherry candy?”

You start to get upset because you didn’t even really want any candy an hour ago and they don’t have the thing you want and now they won’t let you leave. You start to get angry and frustrated and upset because nothing you say will get this person to leave you alone.

The guy behind the counter gets angry with you and becomes vaguely threatening. “Look, I don’t understand why you’re being so upset. I am just trying to help you here. You have a problem and I am trying to fix it, so why can’t you be grateful to me for trying to solve your problem for you.”

You wind up buying a bunch of candy you don’t want just to get this person to leave you alone. You feel sick and shaken. You throw the candy in the trash after you finally get to leave the candy store and the man behind the counter smiles because he feels he did a good deed today by helping you solve your problem.

Not Listening

I have had so many issues over the last few years of people not listening to me. I get that in programming people want to solve problems, but sometimes a problem is not solvable. No one wants to say they just don’t have the answer to something, so they try to get super helpful and solve your problem for you even if all you want them to do is say “Sorry, I don’t have an answer.”

I understand that everyone wants to feel helpful. I understand that a lot of the esoteric problems I muse about do not have easy answers. By aggressively throwing a billion suggestions at me that I have to cobble together you are not helping me. You are upsetting and frustrating me because you’re not hearing that I don’t want a cobbled together answer. I want a chocolate covered cherry, not three different candies that are almost like a chocolate covered cherry. If there are no chocolate covered cherries, then I would rather be able to hear “What you want does not exist” rather than “Take these five solutions and mash them together.”

I also want to be able to tell someone they are not answering my question without them getting in my face and telling me I am being rude to them when they are verbally assaulting me with advice I don’t want. I’m sorry that you’re being presented with a problem you can’t solve, but bullying me into telling you that you’re being helpful when you’re not isn’t fixing the issue and you shouldn’t get to feel good about yourself at my expense.

I have the right to my own thoughts and feelings. I am not obligated to fight with you to be understood when it’s exhausting to me. I have the right to walk away, especially if I get to a point where I am emotionally disturbed without being further harassed because you feel I am being an ungrateful bitch for not accepting your well meaning advice. If I get to that point, the only way you can solve my problem leave me the fuck alone.

Game Development Journal 1: Planning Stage

I find myself with a period of time when I do not have large-scale immersive projects for other people that are absorbing all of my time and energy. For the last two years I have perpetually been working on a book, or trying to finish a project for someone else. As soon as I am done with one project, another one pops up. Work is like oxygen, it will fill every space in a room.

I have been dealing with some anxiety the last few weeks because as of right now there are no projects popping up immediately after I finish this current one. I am realizing that this is actually an opportunity to do something I have not done before, which is actually spearhead and complete a project of my own.

I keep meaning to work on my own projects, but then something amazing will come up and I will feel I can’t say no. Then I work too hard and get burned out and have no time for projects of my own. I feel like I can’t say no to amazing (paid!) opportunities working with amazing people for a gamble on a personal project.

There has been a lot of doom and gloom about how you can’t make a living as an app developer anymore because the market is too crowded and people don’t buy apps anymore, but I am realizing there are a lot of long term benefits to taking a few months to do an app.

Project Organization

One of the biggest complaints I have about working for other people is that they seem to not really know what they want. I have had a number of projects come to a grinding halt because the product owner keeps changing their mind about what they want. There is no point in implementing something if you’re just going to change it tomorrow anyway.

This also leads to project bloat. Once you start changing things or don’t have a plan in place to begin with, it’s really easy to add just one more thing. That “just one more thing” eventually becomes an endless laundry list and nothing ever ships.

I wrote a blog post recently about how this mentality completely destroys my mental health. I like to break my projects up into manageable tasks and I like to have an end, success goal when the thing is done.

I understand that as an app developer your code is never done as there are changes in languages and frameworks, but to me maintenance is different than active development. Adding a feature is another separate project apart from initially shipping.

By running my own project, I can control the features and the development schedule. I can firmly decide what features I want to have and prevent the project bloat. I can also figure out which tasks need to be done first and how to build upon those.

I want to avoid this situation. I like the idea of Agile, but in practice it’s usually terrible. I am really bad at reading other people’s minds about what they want and most people are really bad at expressing what they want. It’s like truthiness. It’s a feeling more than a concrete set of goals.

I am hoping that by actually setting out goals for a project and completing it I can help clients in the future focus their goals into something that has a chance at success. If I fail then I hope to at least get a perspective about why most projects seem to degenerate into chaos.

Why a Game?

I am choose to write a game. No, I do not plan to earn a dime from my application.

I am choosing a game because it seems to be more immune to the issues I talked about earlier. It has a set of rules. It has limited stuff that can be tacked onto it without fundamentally changing the nature of how it works.

I also want to dive more deeply into the Apple game frameworks and some of the Apple frameworks in general.

When you’re looking for a small, self contained project, it’s really easy to pick something that only uses UIKit, like a todo app or a Twitter client. A lot of companies want you to have knowledge of Core Data, but most don’t really seem to use it.

I want to get more comfortable with diving into an unfamiliar set of frameworks and getting something working. I could probably do this faster in something like Unity, but I would like to stick to the Apple frameworks. I might port it to Unity in the future as another project, but it’s not the goal for this one.

Godori

I am not going to be designing a game from scratch. That alone would take a lot of time. So I am going to implement an already play tested game I am familiar with.

I never was into video games, but I did very much like turn based games. I liked board games and card games where you had to think through things.

I used to play chess as a kid, but I really got bored with it because there were no random elements. It was possible to play the same game over and over again. That got boring quickly and I got into games with some more random elements.

There was a shareware game I played a lot as a kid called “War of Flowers.” I did some research on it over the last few years and found it was an implementation of a Korean card game called Godori.

Godori is like Korean poker, to the best of my understanding. The rules are somewhat simple. It uses a flower deck rather than a traditional playing card deck. The flower deck has twelve suits with four cards in each suit. Each card has specific aspects associated with it that affect scoring.

You also have the option to continue playing if you think you can accrue more points before the end of the hand.

This affords a decent amount of complexity and strategy without getting overly bloated. It has set rules it must comply to in order to work as designed. I don’t need to play test the rules because the game has been around for a really long time.

Components

I sat down and made a list (no specific order of importance) of all the parts I think I need to create to make a polished, nice application:

  • Game Logic
  • Artwork assets
  • Card Objects (the list of attributes and values for each individual card)
  • Playing Area
  • Setting up Game Center for people to play one another
  • Game AI if you want to play by yourself
  • Animations, sounds, and various polish
  • Cross Platform compatibility for at least iPhone and iPad

Some of these components build upon one another. It would be stupid to try and set up card animations before making sure the game logic works.

By trying to lay out concrete components that I expect the application to have I am hoping to avoid adding bloat to the project. I am also hoping to focus myself so that I don’t get overwhelmed worrying about how I will get the animations and stuff working before I even get the base programming logic in place.

Learning and Developing

I have a slightly tricky path I want to walk here. I have not really worked with SpriteKit or GameplayKit. My iOS experience is all over the board.

I know I tend to fall down rabbit holes and I am afraid I will get so absorbed in learning everything about SpriteKit that I will never get anything done.

I think I need to dedicate a certain amount of time to learning new stuff. I think that the entity-component system is probably the best way to implement the different values of each card, but I have not used it before. If I was just doing it in Swift I would probably have an enum or a protocol, which might work better, but I don’t know. I would like to have information about all of the tools I have available out of the box before I waste a bunch of time rolling an implementation that I didn’t have to.

I am planning, at this point, to alternate between working on tutorials/research and active development. I want to try to alternate days until I exhaust the tutorials and research. Then I might replace it with generating the art assets.

Long Term Strategies

One reason I want to alternate things is because I feel I have a crop rotation mentality for doing work. If I work on one type of thing too long my brain burns out. I need to have some variety in what I do in order to keep from exhausting the part of my brain that does code.

One issue I have had with contracting is that everyone only wants you to do the most labor intensive aspect of software development. There is no ability to stagger tasks with less demanding ones so you have a chance to recover. It’s like sitting there during a workout and doing only bicep curls. There are a limited number of bicep curls you can do. I would like to do my bicep curls, then go for a jog and then work on my legs. There should be a way of setting this up with programming jobs, but no one wants to do that. They want to force you to do the difficult stuff constantly until you burn out, then they replace you with someone else. Or even worse, you never get to work with anything because you’re too busy talking about what you would do if you did work with something.

I want to see if it’s possible for me to work in the way that is best for me and still earn enough money to support myself. That is the long term goal. I do not want to burn out after five years and then get promoted to management because I hate code and never want to do it again. I don’t think this game will earn me a dime, but I am hoping the professional things I learn from doing it will help me develop long term career strategies.

I hope to document every aspect of this on the blog. I want to explain how I solved various problems and implemented various parts of this application. This is probably overly optimistic, but I would like to to complete this in two months. I hope to not get derailed by mental health issues or just plain getting distracted by shiny objects.

If I work consistently for two months on this and it doesn’t get done, I am okay with that. I just want to develop a work ethic and strategy where I get things done every day without hurting myself.

My “official” start date on this project is September 19th. I am finishing my project tomorrow, but I am traveling to Tennessee for Indie DevStock. I also have a short contract after that and a tutorial to complete. So not completely free, but significantly less busy.

If you have been through this process and wish to share advice, I would welcome it. Get ‘er done.

Follow Up to How Not to Hire an iOS Developer

I got a lot of feedback from my post yesterday. One aspect of that feedback was people letting me know that I didn’t necessarily express what I was thinking and feeling quite properly. Wanted to clarify some of my ambiguous statements so that I don’t just come off as an entitled special snowflake.

First off, I did not mean to imply that I was doing this as a practice interview where I had no intention of ever taking the job. I talked to a recruiter a week earlier and was incredibly enthused about the job. I want to work on connected hardware/software products, which is still a rather niche field. I have realized that I will have to consider bigger companies with budgets large enough to do research and development in that area and a lot of what I heard sounded fantastic and right up my alley. But after I had a chance to look into this company I had some deep reservations about going to work there.

The recruiter said all the right things. I have several things on my list of things that I absolutely need to have if I accept a job. Some of those are easier to fulfill than others. I have accepted jobs based on the word of the person I was talking to that those needs would be respected and a lot of times they were not. I actually had someone say to me “Oh, you were serious about that? We thought you were joking.”

In the past I have had more freedom and flexibility to walk away from a bad situation. I live in a relatively cheap area where my burn rate is really low. I could go back to working in customer service or doing something that isn’t programming if need be to pay my bills. I could even swallow my pride and go to my parents with my hand out and ask for a loan, but that would be the absolute last resort. I would prefer not to, but that is preferable to me to moving to the West Coast. My monthly expenses here including my house and my car payments are significantly less than rent anywhere in any of the cities on the West Coast.

I feel that a lot of companies use the relocation stuff as a means of control. There are places where you’re expected to sign a two-year lease on an apartment. Companies pay to move you out there with the understanding that you stick around for a few years or else you’re on the hook for your moving expenses. You think you’re getting paid an awesome salary, but it doesn’t go as far as you think it will and you wind up living paycheck to paycheck. This puts you in potentially abusive situation where your company knows you can’t quit and that gives them carte blanche to abuse you because you have no choice.

I do not like being in situations I cannot leave. I would prefer to be in situations where I don’t want to leave, but I do not want to be trapped in a city thousands of miles away from my support structure with no way to leave if I am being abused.

I would like to move into integrated hardware/software products and design. The nature of hardware, especially proprietary hardware, means that you generally have to be on location. It is the nature of things. However, I will not sacrifice my physical safety and well being to pursue something I can just do as a hobby in my basement.

I acknowledge that if I want to do the things I am interested in doing, I will probably have to relocate at some point. I just do not want to settle and accept the first position that comes along without any assurances that doing so will not result in me jumping off a cliff. I can afford to wait things out and wait for the right thing to come along, and I am going to do so, even if it means taking a non-programming job to get by.

We’ve been conditioned to believe that abuse is a normal cost of doing business. If you want a tech job you have to tolerate being treated badly and run ragged in order to pay your dues to get to the next thing. That’s bullshit. It is not a necessary cost of being a programmer. This isn’t the Hunger Games. We supposed to be working towards creating a product, not trying to survive the harassment and abuse of our coworkers and managers while still putting on a show in the Productivity Theater while not progressing our skills any further. Fuck that. I am speaking out against it because it’s wrong and it is destroying our community and we need to fight back against this and insist upon being treated like human beings worthy of respect. If that makes me a diva, then so be it.

Another worry I have about moving is dealing with my dogs. I have one of my dogs certified as a service animal for emotional support issues. The other one is just certifiably insane. She can’t be left alone for long periods of time. One reason I have tried to get remote jobs is so that I can receive the benefit of therapy time with the service dog while not neglecting the non-service dog or letting her destroy my house.

Talk to anyone who lives in the Bay Area and they will tell you that no one wants a tenant who has animals. I can force the issue for Delia because of the law around service animals, but I can’t for Olive. Finding a suitable living space for both of my dogs would increase my housing costs tenfold.

I will not abandon my dog. When I adopted her from the pound I made a promise that I would keep and love her forever until she died. You don’t just dump animals at the pound when they become inconvenient. That is sociopathic and horrible.

Additionally, by living where I do, I have parents who can watch her while I travel for conferences, which is something I would give up if I moved to the West Coast. I would also have to find another doctor that I don’t hate. I went without a regular family doctor for five years because I could not find one that would actually listen to me. One told me that I probably fell down the stairs and forgot about it when I had weird bruising I was coming in about. Another one violated HIPPA by gossiping in the hallways with other doctors about a local patient who had to be taken to a mental institution. It’s a really stupid, small thing, but it’s that and a million other small inconveniences that make moving to another city a real pain in the ass that you don’t think about until you get there.

I also did not mean to imply that somehow understanding how the computer works is somehow useless. I am not a script kiddie. I care deeply about computer and software architecture. I am learning assembly language. I am learning how integrated circuits and computer chips are designed. I literally want to go all the way down to the metal to understand how things work.

However, I honestly don’t think asking people to implement algorithms in Java is the best way to gauge how good of a programmer someone is.

Code is a tool to solve problems. By focusing on people who are memorizing a list of common questions we use to filter people out of programming, you’re not getting a good feel for how they approach and solve problems.

Maintainable software is a problem I hear almost no one talking about. There are books by people like Michael Feathers and Martin Fowler talking about how to refactor and support long term projects, but we don’t talk to people about that.

Algorithms are especially a stupid thing to ask an iOS developer. I would say 90% of the work out there involves pulling data off of a server and putting it into a table view. You need to have a good grasp and understanding of UIKit and NSURLSession. Those are things you will use every day. Asking how to implement a linked list shows you have some knowledge of computer science but does not demonstrate that you know jack shit about the iOS ecosystem or its architecture. It might be a good programming question, but it’s not a good iOS question.

When you go and interview at a company, it’s a two-way process. I keep hearing people yelling at me about how the company has to do something to make sure I know how to write a for loop and I am not just a poser. It’s about protecting the company from hiring a fuck up.

There is more that I could do to establish myself that I am working on. I know I need to put more code out on GitHub. I know that I have been writing more about the social aspects of programming this year than on actual technology. I want to rectify that.

I have done as much as I can to show that I am not a fuck up. I am the coauthor on several books on programming. I write about tech on my blog. I present at conferences. Those credentials are clearly displayed on my resume. If you Google me there is a wealth of information about the projects I have worked on.

The fact that this company did not take five minutes to look into anything I have done (or even bothered to look at my resume before interviewing me) signals to me that this is not a good place to work. If they’re not willing to do the bare minimum to find out anything about me then I find it offensive that I have to prove to them that I know how to code.

I do not want to work for a company like that. I especially do not want to disrupt my whole life to move to another city to work for a place that does not do the bare minimum of having an interviewer who has a modicum of understanding about the job they are interviewing me for. If the guy interviewing me knows nothing about what I do then how can they make a determination about whether I am a good candidate or not? None of their candidates might be good. I have lived through that experience and it sucked.

When you get a bunch of programmers together who are all pretending to know what they’re doing, it results in a toxic situation where the incompetent people try to sabotage the competent ones who know they are full of shit. I do not want to risk moving my life to another city where an incompetent blow hard can sabotage my job and my career in a misguided attempt to save their own neck.

Taking any job, especially one that requires relocation, is a massive risk. There is a lot of potential for long term personal and professional damage by taking any job and I have been bitten in the ass often enough to be incredibly careful about fully vetting any company I think about working for to make sure I will not be quitting in two months and looking for something else.

This past year I have taken a lot of jobs that did not work out the way I wanted them to. I did not accomplish what I wanted to. I do not want another year like this. I want to do work I am proud of and not just collect a paycheck. I will not stop looking for that or demanding that the people I work for believe in what they are doing.

This company is probably thinking they dodged a bullet by not hiring the girl who doesn’t know what a linked list is. I am thinking I dodged a bullet avoiding a company where I would be miserable. Isn’t that the point of an interview, to figure out that you don’t actually want to work together after all?

How Not to Hire an iOS Developer

So my current contract ends on Friday. I have spent the last year bumping around figuring out what I don’t want to do and I now have to figure out what I do want to do.

As of this moment I would really like to make a real go of setting off on my own as a contractor and eventually producing my own products, but I know enough people who have not succeeded in doing this to be wary about my chances of success. Recently my father got drunk and trapped me in a car for an hour telling me to stop trying to be special and to attempt to find a real job with a 401k and health insurance.

So, in the interest of figuring out what I want to do with my life, I applied for a corporate job. I figured that it was stable and they pay regularly, so it might not be as bad as I had been lead to believe.

I had a phone screen with someone from a company today and I would like to share my experience with this.

The first part of the interview was awkward, but manageable. The guy asked me about some other projects I worked on. He asked me about a time that I didn’t agree with a manager and how that turned out. I probably should have come up with a different example than one where I got into a blowup fight and was fired, but it’s too late to fix that now.

At no point in this process was I asked anything specific about iOS. He did not ask me about my books or any of the other credentials I have on my resume. I realized that he did not look at it. Awesome.

Then we got to the part of the screen that I didn’t realize we were going to do: The Whiteboard Interview.

I have never done a whiteboard interview in my life. Never. I think they are bullshit and I decided a while ago that I would never participate in one. If you’re reading this and thinking of hiring me, I am not doing a white board interview. Be forewarned!

I had deep reservations about doing this. I know I know how to code, but code isn’t something you just regurgitate on command. It requires context and problems that need solutions. I decided before the interview even began that I did not want this job because it required me to move, but I thought I should at least attempt to get through the interview. I was beginning to deeply regret this decision.

We used a software application to do the white boarding. There was a drop down list of languages. I went to select Swift, but there was no Swift. Strangely, there was no Objective-C either.

Huh. You’re interviewing me for a job without being able to let me write in either of the languages you need me to be an expert in. Interesting.

I looked through the list and tried to find the next one I was most familiar with. After some deliberating, I chose C over Python.

“Don’t choose C.”

The interviewer did not want me to choose C. I asked why not.

“I’m an Android guy and I would really prefer that you pick Java because that’s the only language I know.”

You’re interviewing me for an iOS position and you only know Java. You won’t let me write in the language I am comfortable with because you don’t know how it works. Splendid.

He told me to write a linked list. I told him I didn’t know what a linked list was. I said I never got a computer science degree and that I was a hacker who learned programming by writing applications rather than learning algorithms and data structures you only use to pass code interviews at corporate entities that you forget and never use again.

At this point the interviewer was like, “Oh, so you’re not a programmer. You’re more of a management type.”

I have written books. I have presented technical talks at conferences. I have held down a programming job, more or less, for the last two years. I spent the first half of this interview explaining hardware software integration and architecture to this guy, who still at this point decided to tell me I am not a programmer.

At this point I had had it. I ended the interview as best I could. I told him I was not interested in the job and I got off the phone and had a good laugh.

I am writing about this on my blog because apparently these places don’t read my blog anyway, so it really doesn’t matter.

If you’re going to hire an iOS developer, let them write in their own language. Also, the power of iOS isn’t in the language, it’s in the frameworks. Don’t make someone write a fucking linked list in Java to see if they know how to write an iOS application. Ask them what frameworks they’ve used and how they find information and have them talk you through how something works.

This call annoyed me, but it also made me feel a lot better. As bad as I feel about not being as good a programmer as some of the other people in my circle, at least I am not a Java guy interviewing iOS people for a large company that clearly doesn’t know what it’s doing. I’m sure they’ll find someone who memorized “Cracking the Code Interview” to fake their way through the interview and panic on the job when they realize they don’t know what they’re doing. Hopefully they’ll buy my book.IDontKnowWhatImDoing

Depression and Engagement

One of the major issues I have dealt with so far in my short career is lack of engagement on many of my projects. My managers, for whatever reason, are not around to see what I am doing. They are on business trips. They are swamped with entirely too many other responsibilities. The product owner is ambivalent about what they want to do so we’re waiting around for them to make a decision about something. Not poking at anyone in particular, this has been an issue I have seen a lot of places.

As programmers we’re supposed to be self motivated. We’re supposed to be given a problem and we’re supposed to run with it and get it done. We complain about micromanaging and how it’s hampering our ability to get anything done.

When you get left alone on a project, initially it can feel freeing. You can work without being disturbed. But then at a certain point you realize that you have been given no guidance on what is wanted. It’s like creating an app with no auto layout. You kind of know that there are some components that someone wants, but you don’t know how they want them arranged.

This is the point where things start to affect my mental health.

I start to encounter mental friction where I can’t make any decisions because I don’t know what people want. I know that there is one way they want something but they’re not around to tell me what that is or they don’t know to begin with.

This triggers feelings of depression and despair. I start to feel that success is impossible. I try for a while to do my best, but at a certain point I shut down. I am overwhelmed by choice because I don’t know which one is right. I can’t function. Nothing I do is going to result in success, so why bother?

I feel tremendous amounts of failure and self loathing. I think that I can’t hack it. I should give up on programming. I should go back to working at a call center where there is a script and no decisions to be made. There is no pressure from coworkers trying to sabotage you or pretending like they know more than you do because no one gives a shit and they’re just there to collect a paycheck. You don’t have to pretend like you care about anything other than not getting fired. It’s soothing and restful.

I have had this happen often enough that I can see it coming. I try to engage but so far that has never been successful.

What I need to pull me out of this state is to have something I can solve or get engaged in. I have noticed I will be on the verge of a complete shut down when something will catch my attention. A small light will appear in the darkness and my deprived attention will fixate on trying to solve it. Then my brain comes alive again and I wake up and everything is okay again if only for a little while.

I want to talk about mental self defense here.

I have learned to find things I can do that will pull me out of this state. Usually it’s working on a tutorial. It’s a set of directions with an end goal. You feel like you’re getting something done. It will engage my tired and exhausted brain and lead it like a trail of breadcrumbs back home. It’s not open ended so I don’t get overwhelmed trying to get something working from scratch. I know other people can do that and I can too sometimes, but not when I am engulfed in mental darkness.

Managers don’t want you doing stuff like this. I have tried to talk to them about what I can do to pull me out of this state. I can’t work on the current project. It is causing me to shut down. Is there anything else I can work on so I can mentally recover?

They will purse their lips and say they really need me to keep working on the current project. It doesn’t matter that I am unable to make any real progress on it or that anything I write is going to be buggy as fuck, they want the illusion that I am working on their project.

If you’re working with a manager who isn’t giving you enough constraints to figure out what a successful end condition is, don’t mentally collapse. Try to recognize when you’re starting to shut down. Find things that can pull you out of it.

I know it’s hard to do. You feel yourself getting further and further behind. You’re in a mental terror that you’re going to be fired for not finishing your project. You need to calm down. You need to prevent yourself from going under at all costs. If you break yourself your project is not going to get done. You’re no good to anyone if you can’t function.

If you do break, it will take a while to recover. I see a Reiki therapist who helps me recover from my breaks, but she always tells me to take it easy after she helps me.

I have gotten better at going back to my “analog” hobbies to get away from a computer screen when I feel myself going under. Cooking and doing cross stitch are tactile and engaging and give me a project that I can see progress on so that I don’t go completely insane. It can feel like doing projects is a dodge or a waste of time, but it’s vital time that I need to help my brain recover so I can keep working.

I never think that I am going to feel better. I think that there is no point in trying to do a tutorial because I should just give up and accept that I am a failure. Sometimes I am too broken to work on it, but when I have had a chance to rest, I come back and I feel my brain slowly wake back up and I feel better.

The biggest reason I wrote this is to try and give hope to anyone who feels consumed by mental darkness. I have felt that a lot over the last few years. When you’re in the middle of it you feel there is no hope. You feel you can never do anything great ever again. You feel broken, like everything has been stripped from you and it can be hard to try and engage in something because you’re convinced you will fail.

Please know there is hope. Rest mentally and take baby steps. If you can’t engage in anything, then you’re burned out. Sleep, rest, hike, whatever. Then come back and pick up something structured and engaging.

Engagement is so important to what we do. We mentally need to feel a sense of accomplishment. We need to have tasks that we can complete and see progress in the work we are doing. Creating those meaningful milestones and discrete tasks takes time and mental energy, but it’s necessary to maintain mental health and stability.

A developer career is a marathon and not a sprint. If you injure yourself you need to rest and work your way back up to training again. You don’t want to force yourself over the finish line and wind up in a wheel chair.

Know that you’re not alone. There is a way out of the darkness. It’s not just you.

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.

The End is the Beginning is The End…

September 9th (and the days around it) has, for better or worse, become an important day for me. I got married on September 9th, 2009. I found out later that September 9th was my first ex-boyfriend’s birthday. I started working for Brad Larson two years ago on September 8th. And this year I am completing an important contract on September 9th. It seems fitting.

I feel like I have accomplished nothing of importance over the last year.

I am not blaming anyone besides myself for this. I don’t know what’s wrong. I don’t know if I have been suffering from depression, which has prevented me from fully engaging in anything. I don’t know if I am trying to do too many side projects and am getting distracted with blog posts and conference talks and tech books. I don’t know if I jumped into the deep end too early and I haven’t learned to deal or cope with things yet. I don’t know.

I just know that a year ago when I looked back on everything I did in the year I worked for Brad I was really proud of what I had accomplished and the person that I was becoming and I honestly can’t say that about myself right now. This was a wasted year.

I am tired of feeling like nothing I do matters. I’m tired of being a cog in a system and not seeing anything I work on ever get completed because it eventually gets passed on to someone else and I never see it again and feel no ownership of it. I am tired of feeling like I am chasing after the wrong things. I am tired of not saving enough of my money because I am buying stuff to fill the empty, meaningless void in my soul.

I want to do something important and significant. I want to do work I am proud of. I don’t want to look at code I wrote a year ago and go “Damn! I used to be smart. What the fuck happened??”

I need a change. I don’t know how I am going to do this or what I am going to do, but I do not want to keep living this way. I am tired of this. I want to make something that matters. I want to push myself to be more than I am right now. I do not want another wasted year. I want to look back on September 9th, 2017, and go “This was a good year.”

I am putting this year behind me. Nothing is irreparably broken. It sometimes takes a lot of time and patience to fix things that are broken. It takes some time to backtrack and get back on the right path when you’re lost. It’s easy to give up and walk away. I am not going to do that. I am going to find something that matters to me and I am going to do it. I am going to hold onto that and keep it close and use it to motivate me to keep pushing. Because I don’t want to live like this anymore and I don’t want another wasted year.

The Cassandra Effect

Back when I was a sixteen-year-old high school student, I had a boy behaving in ways that made me very uncomfortable. Any time he saw me in the hallway he would flinch in pain. He started telling everyone in the school that I was the Queen of Darkness and Evil and been sent by Satan to tempt him.

I was a teenager and I had absolutely no idea how to deal with this behavior. The year previously one of my teachers saw another student harassing me and reported it to the vice principal and this person was dealt with immediately. I felt like I could trust the vice principal, who had told me if I ever experienced anything like this ever again that I should go to him and he would take care of if.

So I did. A meeting was called between me and this other student. The vice principal came in and gave me a warm look. Then he saw that the student I was reporting was an honor student and all the warmth drained from his face. He grew very cold and rigid.

He informed me, in front of my abuser, that he did not take spurious reports seriously and that any other reports of harassment about this individual would be ignored. This gave him carte blanche to make my life miserable.

I have gaps in my memory of my sophomore year of high school because of the stress from this situation. I was misdiagnosed with a learning disability and eventually bipolar disorder all because this authority figure did not believe me when I told him I was being abused. This moment had an impact on my educational and eventual professional career because I went from being an honor student myself to getting D’s and F’s.

This was not an isolated incident.

I have encountered a version of this so many time over the course of my life that it is driving me crazy and I can’t take it anymore.

I have had situations where I have known a group of people for years, then I will notice someone starting to sabotage me. It’s always someone who is either in a position of authority or someone who has been there longer than I have. Either I will directly see them having conversations with authority figures above them or I will just see the evidence of it.

People I have known who used to be friendly will immediately grow cold and distant. There will be conversations in the halls that will stop the second I come into view. They will turn around to avoid passing me in the hall. Eventually they get angry and hostile.

Then it’s always a matter of time before I am asked to leave. The clock starts ticking and there is absolutely nothing I can do about it because no one will talk to me directly about it. I have gotten good at recognizing the signs so that I can set up an exit strategy, which is usually fine with the people I am among because they don’t want me there anyway.

I feel like I am trapped in a video game where there is a level I can never beat. I see it over and over again and it makes me angry that there is nothing I can do. It’s a nightmare I never get to wake up from. I feel like maybe this time I will disable the bomb before it goes off and it never happens.

It is incredibly difficult to get men to understand that this is happening because it doesn’t happen to them. Being a man gives you a degree of credibility that you do not have as a woman.

No matter how progressive or aware you are of sexism, I have not had one man believe me when I tell him about this happening.

I get good natured, “Now, now, you’re being paranoid. You’re seeing malice where none exists. It’s probably a misunderstanding.” A man they have never met get the benefit of the doubt over a woman they have known for years, and THESE ARE THE GOOD GUYS!!!

Being a woman means you are always in a position where you have to prove yourself and your version of reality. I have had two separate professional instances where I have worked with men who were making incredibly bad design decisions for the code architecture because they fundamentally did not understand what was happening under the hood. I have presented a carefully constructed technical walkthrough of what these decisions would do and why they cause bugs and crash apps, and the response I have gotten was always “Well, I am just doing what Apple wants me to.”

Guess whose side gets taken. Hint: Not mine.

You are not allowed to make any mistakes. I talk to guys who tell me they made a mistake they thought for sure would get them fired but that they were allowed to fix it and everything was fine. This never happens to me.

I still don’t know the reason why I was fired from my first programming job. I know I got a call right before dinner on a Saturday night telling me that everything I did was terrible and that when the CTO looked at my code he felt like I grabbed him by the hair and punched him in the balls. He would not tell me what the problem was. I lingered there for a few days while they consulted with a lawyer to see if I could sue them. The only changes that I saw to the project I was doing before I was let go was that someone changed the color, which would have taken me all of ten minutes to do. I don’t know if they saw an earlier version of the project, which was a train wreck, because they refused to speak to me about what the issue was. They had been primed by the guy I worked with to think I was incompetent and after they got confirmation of it they looked for any excuse to get rid of me.

People talk about gossip like it’s the weapon of mean girls in junior high. It’s not. It’s the weapon of men.

We place so much pressure on developers to be “the best.” Everyone has to be an 10x engineer. Everyone has to be a code ninja. This has created an incredibly hostile environment where a lot of people feel there is a zero sum game. Having a better developer than you on your team means they are taking away something of yours and you must get rid of them. Women are especially susceptible to this because we have to prove our credibility and it’s not just a given like it is for everyone else. This works so effectively because people are already predisposed to thinking we’re not as good to begin with.

I have also been on projects where I could see an iceberg coming a mile away. I try my best to establish that something bad is going to happen and that things need to be fixed. I try to cover my ass because I know that a problem is coming and I don’t want to be blamed for it when no one does anything about it. They don’t do anything about it, then I get yelled at for not alerting them to the problem earlier even thought that is all I have been doing for months. It’s instantly forgotten or it was never remembered or taken seriously because it came from me.

This makes it difficult for women to establish a base of trust and credibility to be able to rise through the ranks of a company. There are a lot of jobs where I would not make myself a manager because I know that no one on the team will do what I tell them. I have basically given up on that career path because I know it will be filled with failure and disappointment.

I would like to start a product company in the next three to five years, but I know that if I want to do that I need to find a male co-founder to talk to people for me because if I want to have any chance of success I need to work with a man who will give me a degree of credibility that I will never get on my own. I need to find someone who will respect and believe me and back me up when I tell him something. Fat chance of that happening.

When we talk about sexism in tech, we talk about women being asked if they’re designers at conferences. We talk about women being asked to get coffee because someone assumes they are the secretary or just because they’re the woman so they should be the one to fetch coffee and take notes.

We need to have a conversation about this bullying and gas lighting behavior. All it takes is one person on a team to drive great developers away. If you have a team of 20 people and 19 of them are great but you have one foul ball, that one does so much more damage than you can see. All this person has to do is tell a few people that someone is incompetent, who tell other people that too, and before too long everyone on that team “knows” that someone is shitty developer. This is how social crap works. Having a team mostly comprised of men means that most of the time they don’t understand this because they have not been forced to figure out the rules of the game to master basic survival skills the way that women have been forced to.

I am angry. I am tired of this happening over and over again. I find it absurd that I am trusted to write a book on a topic and flown all over to talk about technology but that the second I have a disagreement with a man on my team that I instantly have no credibility. This fucking sucks and I don’t want to take it anymore.

Hey, Just Wanted to Let You Know You’re Garage is on Fire. You Should Do Something About It.

I came back from a business trip a little under two weeks ago. The trip was incredibly difficult and draining for me. I missed my pugs. I missed my own bed. I wanted nothing more than to come home and have some awesome pug snuggles.

I got home and discovered my basement had leaked at some point while I was gone. There is a pool of standing water in one quadrant of the basement. I do not know where it originated. I believe, based on my forensic CSI skills that it came through a window in the corner of the basement, but I don’t know for sure.

My ex-husband helpfully boxed up most of my books in cardboard boxes that were helpfully soaking up a bunch of nasty contaminated water that was sitting in the basement.

I could not deal with it. I am still trying to deal with it.

I speak on here a bit about having depression. Having depression usually means that I either can’t deal with anything or I can deal with one thing at a time. I work from home. I need to keep my job. For the last few weeks, the only thing I have really been able to deal with is doing the things necessary to keep my job.

My basement is unfinished, so I believe if I throw away all of the wet and damp books and cardboard in the basement that there will be no long term damage to the house.

I am aware of the fact that this is a health hazard. I filled my garage can last week and didn’t have room for all of the rest of the stuff that is contaminating my basement. I know there was probably someone or something I could do to get that taken care of without me having to do it myself, but I can’t deal with that right now because all I can deal with is keeping my job.

I went on Twitter to commiserate about how sucky it was to come home to find a problem I had to deal with and I got a lot of finger wagging from people who seem to be under the impression that I am an idiot.

“You know that’s a health hazard, right?”

“Why don’t you have a sump pump?”

“Why do you live in a house? You should relocate to San Fransisco.”

People telling me these things makes me feel like a helpful neighbor telling me my garage is on fire and I should really do something about it while I am also trying to deal with my house being on fire. I am not stupid. I am fully aware of the fact that this is a problem. I know that I need to get that water out of my basement and throw away all the ruined things down there. I just can’t deal with it right now.

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.