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

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.

How Random is arc4random_uniform?

I remember when I was in college and iTunes became a thing. One of the aspects of iTunes that I liked was their feature where you could randomize a playlist.

After using it for a while, I noticed it didn’t seem to quite work. I would make a playlist with ten songs by one artist and two songs by another and every time I would randomize the playlist the two songs by one artist would always play one after another.

A lot of people complained about it. There were articles on the Internet about how random does not mean that the algorithm will always separate those two songs. If you shuffle a deck of cards there will periodically be sets of cards that settle into order. In later versions of iTunes there were options to make thing more or less random, which didn’t make a whole lot of sense to me.

To this day, I am still bothered by what seems to not be truly random modes of behavior. I play a few German-style board game apps on my iPhone and I notice that the dice rolls never seem to feel natural. In Settlers of Catan you roll two dice. Statistically, the dice should amount to seven as the most common dice combination, followed by six and eight. Whenever I play this game, I will have three or four rolls in a row where the dice total is three, which is statistically improbable. If this happened just once, it would be weird because stuff like that can happen in real life, but it happens every game.

I don't want him touching me!

I don’t want him touching me!

Random isn’t random. Humans are bad at making truly random patterns. In the pilot episode of Numb3rs, Charlie demonstrates this by having everyone create a “random” distribution of themselves in the room, which isn’t truly random because everyone is trying to maintain a certain distance from one another. (That scene is about 18 minutes into the episode, if you don’t want to watch the whole thing.) If it were a truly random distribution there would be clumps of people. Cornell has a page summarizing this if you’d rather read than watch.

Humans also mistake things that look random for not actually being random. Synchronicity is the practice of looking for patterns in randomness because it’s the believe that some things are so coincidental that they could not possibly be con incidents but the presence of a higher power. This is the basis for divination methods such as the Tarot and the iChing. There are books about this phenomenon.

So if humans are bad at creating random sequences and see meaning in random patterns, then computers should be awesome at it, right? Well…

RC4 and ARC4

There are a lot of reasons that a computer programmer would need randomly generated values. Most games depend on having a lot of randomly generated values. You can’t play Solitaire without a “shuffled” deck. Having enemies randomly spawn, rolling dice, and a lot of other things depend on random values to work.

Even more importantly, randomly generated values are vital for cryptography and security. It is this purpose that spawned our most used random generation algorithms.

Arc4Random is the most common command used to generate random numbers. A simple way to generate a random dice roll in Swift is:

let diceRoll = Int(arc4random_uniform(6) + 1)

So what is arc4Random and where did it come from?

In 1987 a man named Ron Rivest created the Rivest Cypher 4 (RC4) algorithm. He did this while working for RSA and thus they owned the algorithm.

RC4 is a stream cipher, allowing for varying lengths of bits to be encrypted. It remained secret and secure until 1994, when it was reverse engineered and the cypher was cracked. RC4 was a registered trademark owned by RSA, so this new, public algorithm was named ARC4.

Since this cypher has been cracked, it’s a really bad idea to use this to encrypt your programs. But it still works for creating randomly generated content, so it is now commonly used in things like game programing when you need randomly generated content.

How Computers “Generate” Randomness

There are two flavors of random number generation in computing: Pseudo-Random Number Generators (PRNG) and True Random Number Generators (TRNG).

RC4 is a PRNG, which means that arc4random is also a PRNG.

PRNGs work by generating a table of values from a seed. These values are supposed to mimic what you would get if you had true randomness. If you took an intern and had them roll a die a hundred times and record the result they got (for experience, of course) and made it into a table, you would have a PRNG.

So if you start out with the same seed, you’ll get the same results over and over again. In order to get different results, you need to use another seed.

For most of what you need to do with random number generation, this is good enough. If you just want to have a game on your iPhone where you need to randomly generate bad guys, this is just fine. It’s not fine if you’re trying to encrypt credit card or personal health information.

Random Number Playground

I wanted to test out how random arc4Random is because I feel like there are number that get repeated all the time constantly and it’s not really an even distribution.

I create a playground that you can access here. I am planning to add additional functionality to this over time, but it’s pretty bare bones at the moment.

I decided to run this die roll function twenty times. With six values, there should be about three rolls per number. Didn’t quite get that:

  • Number of 1: 7
  • Number of 2: 2
  • Number of 3: 1
  • Number of 4: 4
  • Number of 5: 2
  • Number of 6: 4

Yikes! This seems to buy into my Settlers of Catan theory that the game is set to screw me over by generating an excessive number of ones.

However, as anyone who does polling and clinical trials can tell you, twenty is not a large enough number to be statistically accurate.

So what happens if you run this a lot? Like a lot a lot? What if you ran this 2000 times? I got these results:

  • Number of 1: 348
  • Number of 2: 304
  • Number of 3: 327
  • Number of 4: 329
  • Number of 5: 347
  • Number of 6: 345

As you can see, if this gets run a lot, then the numbers even out significantly. The number of ones, fives, and sixes only deviates by three.

Conclusions

There is a difference between snapshots of things at certain points in time and long term patterns of behavior. If you look at something like the stock market, stock prices can deviate wildly over the course of an hour, but if you look at long term trends, then they tend to even out.

It’s rather frustrating to play a game expecting the dice rolls to behave statistically. However, if everything in life behaved exactly as you expected it to, it wouldn’t really be random, would it?

Additional Links

Beware of Publishers Bearing “Free” Gifts

I buy a lot of programming books. Like, a lot a lot. If you’re a publisher and producing any books on OpenGl, VR, robotics, etc… I am probably giving you money.

One place that I buy a lot of programming books is Packt Publishing. They were one of the first publishers to have books out on the Unreal 4 engine. They have a lot of graphics and game programming books and their prices are fairly reasonable.

Back in May they had a deal on a set of five books on game development. Two were books I was planning to buy anyway for the price of the other five, so I bought the set of books. I noticed at the end of my invoice that they gave me a 10-day free trial of their online library of books.

One of these things is not like the other...

One of these things is not like the other…

I am already a Safari Books Online subscriber and have access to the Packt library, so I just ignored this add on to my purchase.

(Yes, I do go out and buy books I am paying to have access to through Safari. I know I could save a lot of money by not buying a bunch of programming books I probably won’t read, especially when I am paying to have access to them. Don’t judge me.)

A week later I got an email from Packt telling me my trial was almost over and they hoped I was enjoying their books. I was kind of miffed. I never initialized the trial. I have gotten free trial offers for Safari that I have never been able to use because I wasn’t a new member, but they always had a code that you needed to use in order to start the trial. I didn’t know that the trial would start automatically.

I had somewhat forgotten about this until I got an email yesterday telling me that Packt had charged me $12.99. I went to check on what the charge was for and guess what? It was for a monthly subscription to their online library.

So, they signed me up for a service I didn’t want, gave it to me without my permission, and because I was unaware that they were doing this they started charging me for something I never authorized.

I was incredibly annoyed. I feel this is a really sleazy way to do business. I cancelled the subscription immediately and wrote an email to complain. Here is the response I got:
email

They basically tell me that if I don’t want their subscription I have to cancel it. I grok that. Already done it.

There is no acknowledgement that what they did was underhanded or sneaky. Their response basically treats me like I am an idiot who didn’t know what I was doing.

I know that most services like Amazon and Apple Music and whatever offer you a free trial period after which your credit card gets charged. They hope that you forget that you signed up for a free trial period and they can charge you because you forgot to cancel when the trial was over. That’s kind of sneaky, but it’s still something where you are choosing to opt in. You are saying “I want this and I agree to pay money for this if I forget to cancel my subscription.” I have avoided free trials of things for this very reason.

It is not okay to “sell” someone something they didn’t choose and then charge them for something they didn’t opt into.

There is a bit of shady behavior on this site. They recently released a $50 OpenGL book that is so out of date that it does not mention shaders, which have been around since 2004. People have complained and gotten a “We’re sorry, we’ll pass your criticism on to the author.” This book is still available and does nothing to warn the reader about how out of date it is. Good publishers like the Pragmatic Programmers remove out of date books all the time.

Their royalty structure also leaves much to be desired. The 16% royalty is not necessarily bad, but considering how many times a year they sell every book on their site for $5, I find it incomprehensible that anyone working on a book ever outearns their advance.

It’s really too bad. They have a lot of books on rather obscure and esoteric topics that most people don’t cover. They have one of the few books on the OpenGL Shading Language on the market. As far as I know they are the only publisher producing any books on LLVM. I would like to think there are better ways of producing a broad range of interesting content without screwing over both the authors and the customers.

CocoaLove and Indie DevStock

I speak at a lot of conferences. I have spoken at around ten conferences a year since 2014. That’s a lot of conferences. I have had some not so great experiences and a few really awesome ones, and the awesome ones are the ones I want to talk about in this blog post.

The best conferences I have attended over the last twelve months were RWDevCon and CocoaLove. Both of these conferences went above and beyond to deliver a unique conference experience.

CocoaLove is in Philadelphia and really embraces the City of Brotherly Love vibe. Curtis and his team make sure the food at the conference is local, including an entire lunch activity around getting authentic Philly cheesesteaks.

RWDevCon has the advantage of name recognition because of the years of amazing tutorials that Ray’s team has put out. CocoaLove does not.

Another great conference that might not make it to its third year is a newcomer, Indie DevStock. Indie DevStock is being run by my friend Tammy Coron, a fellow Ray Wenderlich tutorial team member. She talked to me about running the conference with her, but I told her I was too busy. I was mostly too cowardly to actually stick my neck out and try to run my own conference. Tammy has bigger balls than I do and is making a go of it.

Both CocoaLove and Indie DevStock are in regions of the country that don’t see a lot of conferences. CocoaLove is in the Northeast and Indie DevStock is in the South.

Every week on Twitter I see people bitch and moan about the lack of diversity in tech. Everyone wonders what we can do about it. CocoaLove made a concerted effort to have a diverse lineup. Indie DevStock is run by a woman and 67% of their lineup is underrepresented persons in tech.

Both Curtis and Tammy have lovingly put a great deal of work into making their conferences special and unique experiences. People don’t run conferences to make money. These are labors of love. It’s really easy at a certain point to just kind of go, fuck it, and deliver a generic conference experience. We’ve all had our fair share of those. Both Curtis and Tammy really got creative and tried to set their conferences apart from everyone else.

Every year I hear of some really cool and special conference that has its last year because it’s just too difficult for the organizer to run it anymore. NSConf. Second Conf. C4. NSScotland. Everyone bemoans the loss of these conferences.

There are a lot of these conferences that I have been greatly disappointed in missing out on. I’m sure other people are disappointed as well.

I want to suggest that if you live in any area East of the Mississippi you strongly consider attending either CocoaLove or Indie DevStock. I am attending both (and only speaking at one.) Nashville is a ten-hour drive from Madison and Philly is thirteen hours. Supposedly I will be able to bring my beloved pug Delia to Indie DevStock. It’s wonderful to have a few conferences that are within driving distance from me where I don’t have to buy a plane ticket and deal with all the shenanigans I have dealt with this year.

You can use the code “HELLO” to get a discount on a ticket to Indie DevStock.

I know the face of iOS development is changing. We’re growing and evolving and becoming more corporate. I do hope that even with all the growth of the iOS community we don’t forget our funky, eclectic roots. The unique conference experiences that we have are in danger and it’s important for us to support them.

Anyway, I suck at selling things. There’s a reason I became a programmer and not a sales person. I want to help spread the word about these conferences and try to convince people to come so that iOS development doesn’t become just like everything else. Support indie development and diverse voices in tech!!

Streaming WWDC 2016

I have never had the privilege of attending WWDC. Most years (including this one) I never bothered to apply to the lottery because I couldn’t afford to go. The one year I could afford to go, I didn’t win a ticket and I decided I would rather have the money as a buffer than go out to WWDC. This was the correct decision.

I attend a lot of conferences. I speak at a lot of conferences. Unfortunately, I have had some difficulty actually attending sessions at conferences. I have panic attacks when I am trapped in a room full of people and I can’t get up and walk around. This was one reason I was never super disappointed about going to WWDC the last few years. The idea of being stuck in a room for a whole week makes me feel like curling in a ball and crying. I go to conferences to network and drink with my friends. Now I am at the point where it’s just networking since I gave up drinking.

One thing I had forgotten about was discovering new things by attending sessions I hadn’t thought to go to. When I went to my first CocoaConf, I encountered a lot of interesting things because I wanted to watch Jonathan Penn and Josh Smith present.

When Swift was introduced two years ago, most of the conference sessions revolved around talking about Swift. I like Swift, it’s a neat language, but I am sick of talking about it. I am tired of hearing people talk about side effects and protocols and immutable state. I miss the first few years I was an iOS developer when people talked about frameworks and weird little nooks and crannies of the Cocoa architecture.

Taken together, this has created something of a perfect storm where I got burned out on iOS development. I got sick of talking to people about it because it always boiled down to Swift and arguing about code purity and a bunch of other bullshit.

I saw the Keynote this year and I had absolutely no enthusiasm for anything this year. I was irritated and cranky and didn’t want to deal with anything. But I noticed that this year Apple decided to stream most of the sessions live. The sessions were always available online later and last year they started showing select sessions. I watched the Swift ones because it was for my job and was still new and exciting. But I rarely watch the sessions afterward because when I watch the sessions, I sit there and pause every few minutes to try and process the vast amount of information that is being presented. There is a massive backlog of lots of sessions I think would be nice to watch but I never get around to watching. I did not think I would do anything this year.

I was wrong.

Streaming the sessions live has completely changed my life this week.

I work from home and so I just kind of threw the live stream on while I worked on stuff. I have it on in the background. I can’t pause the live stream, so I am not poring over every second of each video minutely. I am getting an overview of what they are talking about so I can go and research things later. I also have a team of people on various Slack channels who are watching it with me that I can chat with about the things we find new and exciting.

There were five whole sessions on Metal this year. The last two years I only got through the first Metal video because I felt like I didn’t understand it well enough to move on to the next video. This year, since they were just on, I could passively leave it on and get through all the videos. If this was a normal year, I would not have encountered the thing that has excited me the most this year, which is doing neural networks in Metal. That was introduced in “What’s New in Metal Part 2,” which was the fourth Metal video streamed. I did not need all the context from the first three videos to get excited about the new stuff in Metal.

I got to watch all the videos about GameplayKit, Photos, SpriteKit, etc… All of these technologies that I have been interested in but in a passive way were all just there for me to listen in on. I got introduced to so many things I didn’t know about in obscure frameworks that don’t get a lot of love because most people need to pay the bills and so they don’t do sessions on SceneKit.

This is what it was like at the beginning when I started going to conferences. I would discover so many new things that I would go home excited to get working on something. I haven’t felt this way for the last two years.

I worked for Brad Larson for a year. He told me that the reason he got into making Molecules and got into OpenGL and doing GPUImage was because he had a free period at WWDC and just decided, on a whim, to watch a session on OpenGL. It’s crazy to me about how things you do on a whim or by chance can completely change your life. By not being exposed to these sessions over the last few years, I have been cutting myself off from these chance encounters to find something truly special that I can learn and make my own.

It has been a great gift to get to participate with WWDC from home. Being able to get up and walk around during a session and cuddle with Delia while listening to people give their talks has helped me tremendously. I can talk to people on Slack from all over the world about the sessions as they happen so we can all be excited together. I know that people get something out of being there and getting to talk to the engineers, but for someone with mental health issues that prevent them from being able to be comfortable with massively large amounts of people, this has been a godsend.

I am planning in the future to go back and watch all the videos from previous years that I never watched because they took too long. I can have them on in the background while I work on other things. I can pick out the parts that interest me and look into them further.

For the first time in a really long time, I am excited about iOS development. Thank you Apple for giving that back to me.

The Value of a Liberal Arts Education

Ten years ago around now, back in 2006, I was beginning to realize I had made a terrible mistake.

I graduated from the University of Wisconsin-Whitewater with a Bachelor’s degree in Journalism with a minor in English composition. I declared this major two years earlier. I attended my first journalism class and the teacher told us to look to our left, then look to our right. He told us that ten years after leaving college only one out of fifty journalism majors were still working in journalism and everyone else had moved on to something else.

I looked around me with a smug expression thinking “Man I feel sorry for the other forty-nine people here who are wasting their time!” Clearly I was not the brightest college student as I should have heard this statement and thought “Run for your life!!”

Here we are, ten years later, and I am one of the forty-nine. I don’t even really know why I chose a journalism major. I knew I wanted to write and I knew I didn’t want to be a high school teacher, so that kind of left journalism and getting a PhD in English and praying that by some miracle I found a tenure position or wrote a best seller. I think the best seller would probably have been the easier goal to achieve.

I kind of wanted to learn a trade, but universities don’t do that. Trades were for people who were too dumb to get into “real” college. I had a Photoshop class with a dude who was forced to retire from his paper because he was so old. He had been a film photographer for forty years so they figured he would be the guy to teach Photoshop. Another student introduced him to the Layers property. There was no hands-on anything. There were plenty of hipsters in skinny jeans gushing about Ayn Rand, however.

I got really good at writing research papers and getting on the bad side of professors who did not like being reminded that they were wasting their lives teaching MacBeth to a bunch of brain dead just barely adults who wanted to drink and didn’t really know what else they were doing with their lives.

Besides the not drinking part, I was also one of those brain dead kids who didn’t know what I was doing with my life. I knew when I was in grade school I was supposed to be learning how to make straight A’s so that when I went to high school I would have a good GPA. I was supposed to do well on the ACT so that I could get into UW-Madison and get an engineering degree, even though I didn’t know what engineers actually did. When that did not pan out, I was supposed to attend another UW system school and get a degree in something, because if I got a degree in something, then there would be a job waiting for me at the end of college.

After I was informed that I had in fact completed all of my course requirements I dutifully went down to the job placement office and asked them what I do now. They said “How are we supposed to know?”

“Um, this is the job placement office. What do you do here?”

“We tell you to put your resume on Monster and connect with the people who you did an internship for, if you did one.”

“I didn’t do an internship. Don’t you have, like, companies that reach out to you to help you place recent graduates with them??”

“Why would you think that?”

I found out later that this stuff existed, but the people I talked to had zero interest in helping me out. I was easily deterred because I didn’t know any better. I also realized I was very screwed.

I didn’t have a demo reel to show prospective employers. I hadn’t done an internship. I wanted to work for NPR, but NPR’s Madison hub was at UW-Madison and they would only hire interns from UW-Madison and if there were jobs after that they would only hire people who had already worked there.

I realized that not only was I missing a lot of requisite skills, I also was missing a network of people to call on to help me find a job.

I had been raised by my dad to believe that personal connections were completely meaningless. If someone was looking to hire, they would put out an ad in the classifieds. They would impartially look at the resumes of everyone that applied and if you had a better GPA than someone else, you would be picked.

This is complete and total bullshit.

I spent a decent chunk of time being incredibly angry that I did not get picked over less qualified people simply because the company already knew this person because they were referred or had interned there. I realized very quickly that if I wanted to get jobs I had to be that person that people knew rather than getting angry about how “unfair” things were.

I also realized these placed wanted people who actually knew how to do technical stuff that I didn’t know how to do. I hadn’t learned any of this stuff in college and I didn’t know how to learn it, so I held my nose and enrolled at a for-profit technical college specializing in audio and video technology.

I spent two years there getting to touch real sound boards and real cameras. A lot of our classes were working through the Adobe Classroom in a Book for things like Illustrator and After Effects. This is technically something I could have done from home, but I would have had to convince someone to buy copies of these programs for me and I would have had to have had the discipline to just sit my ass down and work through the book without the threat of a failing grade hanging over my head.

This place also exposed me to something I couldn’t get at my first college: Connections.

My mentor at this school was the guy that got Slipknot signed to a record label and engineered their first album. Another guy was a guitarist on a Nine Inch Nails album. Yet another worked with Michael Jackson.

This was the school where I also learned how to learn on my own. Halfway through my time there, there was a massive upgrade to both the Adobe suite and Apple’s Final Cut Pro suite. I didn’t know how to work with the new software and so I asked a teacher for help. He sat down and worked with me and showed me where everything moved.

I looked at him and asked, “How do you know this? Who taught this to you?”

He looked at me kind of confused and said, “Well, nobody. I got a copy of this a few days before class started and I taught it to myself because I had to know it to teach you.”

That was the first time it ever occurred to me that one day I was going to be on my own. That technology changes and you can’t just keep throwing out money every year to keep taking classes to learn all the changes. When you’re a professional, you’re responsible for knowing your own stuff.

After that I quit asking as many questions. I tried to find out the answer for myself before I would ask for help. Slowly over time I stopped needing to ask for help altogether because I could find any answer I needed.

I worked really hard to try and connect with these people, but I ran into a wall that would prove insurmountable: I was a woman.

As much as people bitch about how sexist the programming community is, it’s nothing compared to the music industry. There were companies expressly telling the school not to send them female candidates because they would not hire women. The guys in my class kind of treated me like a talking dog and would never take me seriously. They would all hang out at strip clubs after school and it was very clear that I was never going to be welcome into their ranks.

Well, actually, it’s possible I might have, but I think I would have been raped and drugged and generally abused for a job that pays ten bucks an hour. No thanks.

After doubling down on this bad bet, I had to find yet another thing to do, which was how I got into programming. I learned my lessons from these previous experiences in that it was really stupid to try and break into “prestige” jobs where there are fifty qualified people for every job out there. Even in something like programming, where there is supposedly a lot of demand, you have to know people and they have to know you. You can either do that by dropping close to six figures getting a computer science degree from UW-Madison or you can work your ass off networking with people and making public contributions on places like GitHub (or this blog).

Even though I never got paid a dime as a journalist, the training I received for that has proven invaluable. I learned how to distill down a lot of information into its most important parts. I learned how to ask good questions and figure out what the root of an issue was. I learned how to write very clearly, effectively, and concisely. My experience doing radio helped me tackle conference speaking, which gave me the kind of visibility I needed to break into programming.

I learned to hustle and work my ass off. I did not want to be in a position like I was ten years ago when I assumed the world owed me something just because someone gave me shitty life advice.

Life doesn’t owe you anything. People will pay you if you can do something for them that is more valuable than what they are paying you. People are more likely to pick whoever is the first candidate that is good enough and if you’re one of the first people they consider you’re more likely for that person to be you.

In spite of all the pearl clutching about how writing as a skill is going in the crapper, there is a lot of opportunity out there for people who can write effectively, especially in highly technical fields. I think it’s easier to learn the tech after the writing because if you learn the tech first, you’ll find someone to pay you enough money to not bother with learning the writing. That is never the case the other way around.

Even though things were pretty bleak ten years ago, failing spectacularly was a wonderful learning experience. I am happy I failed early so that I could have enough time to process that experience and pivot to something else before it was too late. I see people who never struggled with anything suddenly hit road bumps in their thirties and have no fucking clue what they’re supposed to do. I am proud of the person I have become and the life I have built for myself.

That is the value of a liberal arts education.

Non-Alcoholic Experiments: Iced Tea

I recently wrote a blog post about giving up alcohol. I had an incredibly frustrating conversation with another developer on Twitter:

I love the smell of bullshit in the morning.

I love the smell of bullshit in the morning.

There is a great deal here that is wrong with our conversation here. This person clearly didn’t read my blog post because I mentioned not being able to drink without becoming violently ill. The issue also isn’t about telling people how to drink in moderation, it’s about the fact that alcohol is incredibly pervasive in the programming community. Would love to see this person telling an ethical vegetarian to just eat meat in moderation or avoid places that refuse to accommodate them and see how well that goes.

I have had multiple official conference events and activities that take place at breweries. It isn’t just deciding you’re not going to go hang out at the hotel bar. There are mixers and parties that are officially parts of the conference. I have worked in places where there is an office liquor cabinet.

At conference parties there will be a clear sign explaining all the wine and beer selections and nothing mentioning anything non-alcoholic. Sometimes you get lucky and they will have Coke, but lots of times there is just water.

Later this developer basically told me that you can’t please everyone. I am not talking about “pleasing everyone.” The fact that it’s assumed that everyone drinks and things are geared around that is quite troubling. There are people who have religious objections, health issues, or are, god forbid, pregnant, that don’t allow them to drink and casually talking about it like it’s a choice, like deciding you won’t eat mushrooms, is incredibly insulting. Also suggesting that if you don’t drink that you should just avoid conferences altogether is yet another example of how we as a community are phasing people out and excluding them. Yay diversity.

Twitter2

Another specious argument was that all non-alcoholic options are more unhealthy than “good” alcoholic options. In spite this person’s claim to the contrary, scotch is not healthy. I agree that juice and soda are full of sugar and no one would claim that they are health food, but neither is scotch. What do you think alcohol is? It’s sugar! Making a claim that having a soda or a glass of cranberry juice at a conference is a less healthy choice than having scotch is bullshit. They’re both unhealthy, but I can drink the juice and I can’t drink the scotch. A glass of juice is not metabolized through my liver. I can drive after drinking a glass of juice. I can take an ibuprofen the next day without jeopardizing my liver. Also, no one is healthy 24/7. We occasionally indulge in something and it would be great to be able to work with people to have less damaging indulgences rather than just saying to go drink water. Telling me what I can and can’t have because you have personally deemed it to be unhealthy is arrogant and presumptuous.

We are programmers. We brag about how great we are at solving problems. We talk big about being disruptive and trying to change the world. I call bullshit on this community that we somehow are helpless in the face of trying to figure out ways to be inclusive to people who do not drink alcohol. There are a lot of ways this problem can be dealt with and just shrugging and saying you can’t please everyone, stay home is not the right response.

Trying to Figure out Replacements

One of the big things that I miss about drinking is not the actual drinking part, but the stuff around it. I miss picking out wine and different flavors of vodka and mixing drinks. I miss using my cocktail glasses. I miss having a process of making things.

IMG_4523This last part has somewhat been replaced by learning how to cook, but I still miss being able to make stuff for myself.

A number of people suggested I replace my wine with tea. I was resistant to this switch because I already have tea keyed in my brain to work. When I get up in the morning, I go through a ritual where I brew my tea in my cast iron tea pot and pick out my mug and sit down to start work for the day. I don’t want to drink more tea at night when I have been drinking tea all day because it will not let my brain relax and realize that work is over.

I did, however, forget about iced tea. My dad was from Tennessee and the only tea he ever drank was iced tea. He did unsweetened Lipton iced tea, but I have realized this is a possible solution to some of the issues I have had with finding a replacement for alcohol:

  • There are a lot of different teas on the market
  • I can mix and match teas to make different flavor combinations
  • I can add in different flavorings like lemon juice
  • I can use a special glass

IMG_4522In order to avoid polluting my mind by confusing it about the teapot, I use a different cast iron teapot for iced tea. When I used to work out of the house I bought a second tea pot for work and kept one at home. I stopped using the work teapot because it’s capacity was a little too large and the tea would go cold before I could drink all of it. It brews about four cups of tea.

A while ago I invested in a tea water machine. One of my bosses had one at a previous job and it was always great to be able to just get up and brew tea any time I feel like it. My house’s electric system is wired badly and I can’t heat water for tea if I am using the toaster oven or running the dishwasher. This heater resolves that issue and has resulted in me drinking more tea because it removes a step and makes it easier to do it.

Since I am watering down the tea with ice, I want it to be strong. I have been using three tablespoons of tea. I want to have my tea be fruity, but I also want it to have some of the health benefits of tea. I brew this for at least seven minutes to try and extract as much flavor from the tea as possible before throwing it out. I usually reuse tea that I drink hot, but when I am making iced tea or chai I use the tea once because the second brewing is too weak.

I know it’s terrible, but I have a number of herbal teas from Teavana. They are very strong and if you blend them with a green tea, they add a lot of flavor. I have been using one part herbal tea to two parts green tea. This gives a distinct fruit flavor while retaining the health benefits of the green tea.

I want this to be something of an indulgence without being too unhealthy. I added an ounce of lemon juice and a quarter of a cup of sugar. I check and that is about 190 calories of sugar, which is about fifty calories per cup of iced tea, which gets watered down significantly. For comparison, an ounce of scotch is 64 calories and a glass of red wine is 125 calories.

Trying to do Better

I consider this experiment a success, but I know this doesn’t translate as a solution to the larger problem of having better non-alcoholic options in the programming community.

Cheers!

Cheers!

One of the reasons I am trying to do these experiments is to eventually figure out bette solutions that can be implemented within the confines of the system. I know that if I go to a bar with people I can order non-alcoholic beverages, but I would like to figure out a solution for catered events where there is generally wine and beer but not any other creative non-alcoholic options.

Most people don’t do something unless it’s easy. Right now it’s easy to drink alcohol because it’s the default. It easier to just drink wine and beer because they’re the most prominent options and everyone else is doing it. I think if it were easier to make non-alcoholic choices more people would do them and it would make more people feel welcome at these events.

The Pervasiveness of Alcohol in the Programming Community

Several months ago I decided to cut back on drinking. Basically I woke up in the middle of the night and just kind of decided I didn’t want to do it anymore.

I have been going to therapy for the last few months to try and work through some issues and sadly my self medication with alcohol is one of those issues. My therapist keeps telling me I am a recovering alcoholic. I dislike that characterization. I think I had a rough couple of years and I drank to numb myself and escape my problems. That might be the definition of an alcoholic, but I still dislike the characterization.

I thought I could just cut back to a normal amount, but since I gave it up I can’t drink without becoming violently ill. I blew a conference talk because I was suffering from severe illness after a night of drinking with my friends. At NSNorth I drank wine at dinner (and didn’t even go through all my drink tickets) and was so violently ill the next day that I had to spend several hours curled up in a ball on the floor in the corner because I couldn’t stand up without a great deal of nausea.

I have somewhat accepted that I probably can’t drink anymore. I am trying to adjust to a life without alcohol. Since I have abstained from it, there are a bunch of things I have noticed that I wanted to share.

Identity

When I was younger I wanted to be Marion Ravenwood. I loved the scene from Raiders of the Lost Arc where she drinks the guy under the table. I loved that she didn’t put up with anyone’s shit. I thought she was awesome.

I found a lot of alcoholic role models in my young adulthood. Lucille Bluth. Dorothy Parker. The characters in Mad Men.

I'm fabulous and will not put up with your shit.

I’m fabulous and will not put up with your shit.

Alcohol, especially whiskey and other hard liquors, is very masculine. I would try to impress guys by ordering scotch and whisky drinks. There is some feeling of power that comes with ordering whisky. You feel like Don Draper or Peggy Olson. Laymen drink beer. Executives drink scotch.

It can also be very feminine ala the emergence of the Cosmo from Sex and the City. It was fun to go to the bar with friends and hold a pink drink and be girly in a large group of men.

I felt like I could adopt a personality based on what I felt like drinking. I would relax and other people would relax too. I would have deep conversations with people who would let their guard down and tell me things they would normally not say out loud in front of other people. It felt like an intimate experience where you could be with someone who would let their inhibitions down.

I miss alcohol.

I feel like I lost part of my identity. I know that it was not good for me. I gained twenty pounds since I started programming and most of it is from alcohol.

I keep getting emails from cruise lines trying to get me to book a cruise. If I can’t spend the whole cruise drinking then what’s the point? Why does anyone else even go on a cruise if not to have an excuse to drink at 8:00 in the morning??

For a long time I had no idea how to spend the hours between when I finished work and when I had to go to bed. I realized how boring nearly all of my activities were.

I miss the taste of it. I miss the relaxed feeling I got when I had the first drink. I miss going to the store and looking at all the different options I had for wine, liquor, and hard cider. I miss trying new stuff. I miss the glassware. I miss feeling like a grown up sophisticated person and not just a hermit from rural Wisconsin who hides in her house with her pugs and her programming books.

Which leads to my next observation.

Community

It’s weird to me about how big of a part of my life it became. I never drank in college. I went to one beer party and drank soda and didn’t even process that I should want to drink alcohol. Considering I went to a party school in Wisconsin, that’s rather remarkable.

I didn’t have any sanctimonious reasons for not drinking. I just didn’t like the way it tasted. I saw my classmates drink whole bottles of vodka in an evening and black out and not remember what happened the next day. One friend broke her ankle and didn’t remember how it happened and I had to try and help drag her to the campus medical center while she tried to keep herself from throwing up from alcohol poisoning. I didn’t understand what the appeal was of doing this.

I also wasn’t really social in college. I spent most of my evenings in my dorm and later my apartment watching DVDs and doing cross stitch projects. I never really had friends or a community, so I just kind of kept to myself and it wasn’t part of my awareness.

It was probably telling that the first time I ever got drunk was at my bachelorette party. I didn’t drink until I got married. Most of my social activities with my husband revolved around alcohol. We went to dinner at hipster bars with Prohibition-era cocktails. We would go camping and drink around the fire.

I am not totally placing the blame on him. I embraced this lifestyle. I would push to go to certain restaurants over others because I liked their drink menu best. I kept drinking after he moved out and we got divorced. I just remember that most of the good memories I have about being with him revolve around drinking.

I also noticed that most of my social activities are severely curtailed without drinking. Most of my friends brew beer and make wine and mead. They spend their nights at bars playing games. A friend of mine keeps telling me I should move to a more expensive place downtown so we can randomly go to the bars on the spur of the moment and go out drinking with him.

There have been a lot of conferences I have gone to that have social activities at breweries. I was always annoyed that most of these places didn’t have wine, but they also didn’t have non-alcoholic options either.

Me at my heaviest. I would prefer not to stay here.

Me at my heaviest. I would prefer not to stay here.

I am thinking back on all of the conferences I have attended over the last two years. There are open bars with wine and sometimes cocktails but I have no idea what, if anything, they had that was non-alcoholic. They probably had mixers like cranberry juice and Coke. I am not blaming organizers. I know that it’s far more common for event caterers to just have wine or beer packages for events. I am not going to be pissy because organizers don’t make sure there are things like mocktails or better dry options. I am just saying it’s something that has been so pervasive in the fabric of the conference scene that it is like oxygen. It’s just there. You don’t think about it or notice it until you can’t do it anymore.

I have never been pressured into drinking. I have been the one pushing the whole “let’s all drink right now!” bandwagon. That was wrong. I would like to try and rectify some of the passive damage I have contributed to our community.

A lot of the conversation we have in the programming community about alcohol abuse tends to revolve around the possibility of sexual assault. It is an insulting argument that puts pressure on women to abstain from alcohol to avoid being raped. It also is like a parent who will take the ball away from everyone just because one person is being a jackass.

We’re getting better about talking about mental illness and I would like that to also include how we talk about and deal with alcohol. I would like there to be better and more prominent choices for non-alcoholic beverages at conferences. I would like people to think more about what they are doing rather than just grabbing a beer because it’s there and it’s what everyone does.

We’re all self medicating from punishing crunch times and crippling impostor syndrome. It’s an escape from the pressure we’re putting on ourselves to avoid having to confront any of the very real problems that we have with how we deal with stress in our community.

We, as young adults, don’t seem to have healthy social outlets for socialization that don’t revolve around drinking. I understand that it lowers inhibitions, but I feel like I can’t go out and do anything socially because I don’t want to drink.

I am not trying to be sanctimonious and tell people not to drink. I just would like people to have some awareness of what they are doing rather than just treating it like oxygen. Now that I can’t drink I am seeing lots of things I never noticed before and it worries me.

What Makes an Advanced Programmer?

Right now one of my side projects is learning C++. I want to write game engines and program micro controllers on robotics projects and do a lot of other work that requires a lower level language like C and C++. I already do a decent amount of work with graphics and audio programming where most of the resources are C/C++. I eventually want to learn assembly language, so if anyone has any suggestions for that, I would greatly appreciate it!!

For years I have heard people warn me away from C++. Everyone says that there are a lot of sharp edges and it was a poorly designed language and how much better a language Swift is. I haven’t delved into this enough to determine if that is the case.

What I do notice is that there are a lot of learning materials out there for beginning developers. Right now I am working through a book called Beginning C++ Through Game Programming. Even though it’s going over a bunch of concepts I already understand like “for” loops, it’s still helpful for me to actually type out the code. For me, I learn by doing stuff. I learned iOS programming by doing the tutorials in the Big Nerd Ranch book over and over again. Having some C++ typing exercises helps me to just get a feel for the language.

But this has made me think further about the nature of this book. It’s an introduction to C++. It goes over all the basic stuff you would go over in an introductory programming class. How do you go from this to advanced programming?

I know there are a multitude of books by Bjarne Stroustap about C++. There are books on C++ for the impatient, the fearful, and the overly optimistic.

I don’t understand what makes something an advanced book for a language. My starter language was Objective-C with the iOS frameworks. Any general iOS book, by its nature, is a beginner book. There are books on Swift, but we don’t have advanced and beginner Swift books. Most of the “advanced” books I see on iOS/iOS related technologies are all on frameworks and APIs. There are books on OpenGL for iOS, AVFoundation, Core Data. There is no Advanced iOS book. What would that even include anyway? The whole point of iOS is to get the programmer familiar with UIKit, one of the languages used for iOS programming, and how to look at the documentation for any other framework they would need to understand.

How do you have an advanced C++ book? How do you become an advanced C++ developer? Do my experiences with working on sustainable software implementations apply to my experience level with C++ or is there some magic thing I have to do that is C++ specific? What projects do I work on to be a better C++ developer? Is C++ like iOS and Java where it’s all about the libraries that come with C++? Are there books on the C++ libraries like there are for iOS?

I feel like we, as a community, are very competitive about who is or is not a good programmer. I think we feel that the longer you’re a programmer, the better you will be. It doesn’t matter if you haven’t progressed at all in the last five years and you don’t think introspectively about how to do better. We all want to prove that we’re a 10x developer. We spend so much time talking about how great we are at programming that I don’t know that we have any kind of consensus about what a great programmer knows how to do and how they’re different than a beginning programmer.

For a while I thought that having a great understanding of design patterns made you a great programmers. I don’t think they hurt, but I don’t think that is the be all and end all of programming. I am now in the camp of saying that having a good understanding of the problem you’re trying to solve and making sure your code is readable by beginning programmers is the mark of a great programmer, but as I grow and evolve that might change as well.

I know you can’t package experience in a book like you can a tutorial on how a “for” loop works, but couldn’t we at least have a general direction we can send people in to develop these skills on their own? What makes a great developers? Having a project that has more than ten classes in it? Maintaining a framework for five years? It used to be publishing an app on the store, but I don’t think that is the hallmark of a great programmer because I notice they tend to get abandoned after a year and so you’re not around long enough to be pissed at yourself for putting singletons everywhere and then deciding to go back and rewrite the code in a more maintainable way.

I find my skills do not develop when I am thrown on a project for two weeks where I am just trying to not break the code until I am pulled from that project and put on something else. I am not developing skills when I don’t have a problem I am trying to solve or a cohesive project with victory conditions to complete. I had those at my first programming job and I don’t have them anymore and I feel completely adrift. I have no idea how to get myself back on track and do those things for myself. Anything I do on my own feels too small for me to really learn from or else it’s entirely too large and becomes daunting to me.

I would like a project or a framework or something with a great deal of complexity that I have to maintain for a number of years and possibly have to coordinate with other people. I am trying to find an open source project I can do this with so that I can try to push myself to be a better programmer. I would like to understand why everyone hates C++ and be able to just get to the point where I can work on something and go “Oh, so THAT’S what everyone was warning me about!” I can’t do that with the abstracted books out there and I don’t think I can get a job doing C++ without having actually demonstrated knowing how to avoid getting bruised by it and I don’t see any way to get experience with it except to find a job.

If someone has a simple solution I would love to hear it. Sometimes I feel like nothing ever changes and we’re just doing the same thing over and over again in different flavors of C.

TeachYourselfProgramming21Days