Category Archives: Writing

Late Summer 2017 Conferences and Availability

A little over two weeks ago I finally was able to submit the final chapter for the rough draft of my book. I started the book back in October and it’s been a real trip. One thing I have not been able to do during the time I have been writing the book is have a stable full time job. Book writing is a full time job in and of itself, but it sadly doesn’t pay super well. One of my goals in the next few months is to line up a job so that I can start digging myself out of the hole I’m in.

I have two months to line something up. I am going to be speaking at a lot of conferences and doing a lot of traveling over the next two months. If you’re interested in seeing me, here are some of your options:

  • That Conference: That Conference is a spin off of Code Mash. It is a multi-platform conference that takes place at the Kalahari Resort in Wisconsin Dells. My talk on graphics programming will be on August 8th, which also happens to be the same day the final editing pass on all of my chapters is due. Busy times.
  • 360iDev: After missing the conference last year due to various work commitments, I am looking forward to coming back and seeing all my old indie friends. I will be doing a similar talk on graphics to the one I did at That Conference, but more tailored for iOS. That will be on August 16th in Denver, CO.
  • iOSDevUK: I get to take my second trip across the pond, both this year and in general, at the beginning of September. This conferences is in Aberystwyth, Wales and I will be presenting a two-hour pre-conference workshop on ARKit on Monday, September 4th.
  • Strangeloop: My final conference will be another multi-platform conference, but this time about cutting edge technology. I will be giving a talk on GPGPU programming on the iPhone using Metal and will try to talk a bit about CoreML. Strangeloop is in St. Louis, MO.

The book is set to release on December 4, 2017. I am working on the sample code that will accompany the book. My focus in writing the book was to provide more conceptual information about how Metal can be used rather than just cataloging the API. One of my frustrations in trying to learn OpenGL was the focus on the API with the assumption that everyone knows what a texture is and what Euler angles are. It is my intention that anyone buying the book use the sample code I am creating as canon since both Metal and Swift change so rapidly. I will maintain it and keep it up to date and I hope to add to it as new features become available.

I feel incredibly lucky to have had a chance to write this book. From the moment Metal was introduced in 2014 I felt like it was my thing. I worried I waited too long to get involved with it, but it seems like it’s been rather difficult for people to approach it due to the vast amounts of other concepts one must be familiar with before one can use Metal. I am hoping that this book helps open Metal up to other iOS developers.

I am planning my next steps right now. Beyond just finding a job and getting a paycheck, I have a few goals over the next few years that I would dearly love to fulfill. I will be sure to post more about them when they become more tangible. So far over the last ten years things have simply worked themselves out. I am hoping that this streak continues and that I know my next step when I see it. Until then, I am going to focus on the tasks ahead of me and do my best.

What Will Your Verse Be?

Yesterday was the conclusion of WWDC 2017, and what a WWDC it was. It felt like everyone got what they wanted. Most developers got better stability in tooling and not too many changes to the core frameworks. We also got some breathtaking graphics and games APIs, like ARKit, along with easier integration for machine learning models, such as MLKit.

I watched the keynote in awe, my brain exploding with everything that was now possible in iOS. I had augmented reality on my wish list, so that thrilled me. But seeing how much love Apple gave Metal really touched me deeply. I have spent the last eight months working on a Metal book and I had feared that it would land with an unceremonious thump and no one would care about a three year old technology framework. The keynote gave me hope that Metal would be a continuing important part of Apple’s future for the time being and that my efforts were not wasted.

I downloaded the Xcode 9 beta with the intention of diving into ARKit. The beta still has not been extracted from its .zip file. I got home and immediately became overwhelmed by everything. There are so many new things. I tried to look at the docs but my head swam and I couldn’t deal with it.

The next day I started to see people posting their own AR efforts and a few days after that I started seeing ML efforts. I got very depressed. I left the keynote feeling like I was ahead of the curve and now I was already behind it again.

I feel we in the Apple Developer Community have been trained to jump on every new shiny thing Apple announces immediately. We all remember missing out on the Gold Rush when you could put out an app that you made over a weekend with some new piece of technology that Apple created and earn $10,000 in a week. The new Photos stuff allows us to do a vast but limited number of things and if you want your Photos app to be the top dog you have to get it out before anyone else does because you all have access to the same tools and the barrier to entry is low.

I want to be emphatic about this point: That is not the same situation with ARKit or Core ML.

My background is in the creative field. I wanted to be a film director and do sound design. My dream since I was a child was to have the Back to the Future experience of getting a box of books on my doorstep that had my name on them and to know I wrote a book. I have had that experience several times now and I feel quite blessed that I got to have that experience.

Anyone can write a book. We all have access to the same tools. There are fancy authoring tools like Ulysses and Scribner that cost $50, which is basically nothing compared to the cost of being an iOS developer. There are self publishing sites everywhere that will allow you to publish your book if no one else is interested, or if you don’t want to give up 50% of your royalties.

Just because anyone can write a book doesn’t mean everyone will write a book. Also, it doesn’t mean that someone else is going to write your book.

We still read stories that were written hundreds of years ago because they speak to something foundational about how we see ourselves as human beings. I read Tarot cards and the cards haven’t changed for a hundred years in spite of all of our changing circumstances because even though we all have iPhones and can connect at any given moment, what makes us human has not changed. We all worry about money. We all strive to advance in our careers. We all crave love. We all desire to have some kind of family, even if that family consists of friends and a grumble of pugs. Those aspects of ourselves don’t change.

A story by Jane Austin still resonates with us because we know how difficult it is to find another person you are willing to spend the rest of your life with. Romeo and Juliet still appeals to hormonal teenagers to whom every little bump in the road is the end of the world and for whom every relationship is forever. Unfortunately, the same applies to Twilight.

One reason so many people are appalled at the behavior of the Republicans right now in trying to strip tens of millions of Americans of their health insurance is because it goes against our script of what we think people should be like. Atrocities like the Holocaust speak to us on a deep level because it goes against our human nature of the way that we think people should behave. And it keeps happening. This is one reason The Lord of the Rings and Harry Potter have such staying power. They speak of ordinary people being placed in extraordinary circumstances, facing incredible odds, to attempt to defeat evil. The evil of Lord of the Rings was a different evil than we have now, but evil is never truly defeated. If you wanted The Legend of Korra, you know that light and dark are in an eternal battle where one can never truly vanquish the other.

Yin and Yang. Darkness and Light. Good and Evil.

Augmented Reality has me excited because it opens up another medium to tell stories. You could create an AR app that takes you around the Tower of London while you investigate the disappearances of the Princes in the Tower. You can stand on the site that Anne Boleyn lost her head and see the crowds of people observing the event. It makes these old sites and dusty facts come alive in a way that they can’t if you’re just reading about them in a book.

Technology in and of itself doesn’t make something compelling. Every Jurassic Park movie has dinosaurs, but only the first one truly feels special. When I think about Jurassic Park, I don’t think about the dinosaurs. I think about the characters and their story arcs. The overarching story arc is a tale of human hubris where a con man with a bunch of money is able to cobble together extinct animals by buying enough technology other people developed in order to create an amusement park to make money. He doesn’t think through the consequences of what he’s doing and is brought low by his own hubris.

The secondary arc of the film has to do with Alan Grant. The first thing you learn about him is that he hates computers and technology. Nothing in this movie is going to change that opinion. The second thing you learn about Alan Grant is that he doesn’t like children. So of course he is the one that is stuck watching the children after the park goes to hell. He goes through a fundamental change by having to interact with actual children and at the end of the film they snuggle with him as Dr. Sadler starts ovulating. It keeps Dr. Grant from just being the crabby guy who loses all of the good one-liners to Jeff Goldblum.

We’ve seen many other films in the last 25 years that have dinosaurs, including the most recent Jurassic Park last year. But none of these films have the satisfying feeling that the first one does. It has an encapsulated story and a grand theme of human scientific hubris. Everything goes to hell the way it’s foreshadowed. The park is destroyed by the unnatural force that was brought into it, and all of the people we actually care about survive. It’s a satisfying story that is enhanced by the use of special effects that are actually used quite sparingly.

One reason Pokemon GO was so successful was because it was building off of an experience that people have been emulating for 25 years, which was to pretend to live in a world where little pocket monsters live in the tall grass and can be captured and made into your friend. There is a sense of wonder about Pokemon GO in that you can take it into the normal world that you inhabit and you can lift the veil on the normal world and expose a fantastical world you never knew was there. Most people agree that Pokemon GO was rather repetitive and the game play wasn’t great, but it created an experience that was wanted by a large number of people. The same thing happens when people visit the Wizarding World of Harry Potter theme park.

One thing these have in common is that they are pre-existing properties that have large and established fan bases. Most developers aren’t going to be able to go out and create their own Doctor Who augmented reality application because of licensing issues. So that means that there really isn’t a hurry to go out and do whatever the first few AR apps are going to be. If a company like Warner Bros wants to release their own Harry Potter AR app, you can’t stop them. But you can think about what story you want to tell.

AR is a tool that is made or broken by the story that the creator wants to tell. You can create an interactive murder mystery or a tour of a museum. There are so many unexplored avenues of AR that the limit is what you can imagine and how much work you’re willing to put into creating that experience.

We have such tools to create and express ideas, yet few people seem to. I am guilty of that as well. I do hope that the barrier to entry gets low enough that I can spare some time to create some experiences for the joy of creation. But please do think about creating something for the joy of creating it and not because you assume that there are a wealth of new AR related jobs or a limited number of AR apps to be created and you must pursue the money train on this. That train goes over a cliff. We have so many media for self expression and no time to do it and no stories to tell. Life is filled with possibilities if you lift the veil on the real world and reveal the hidden one.

We don’t read and write poetry because it’s cute. We read and write poetry, because we are members of the human race. And the human race is filled with passion. And medicine, law, business, engineering — these are noble pursuits and necessary to sustain life. But poetry, beauty, romance, love — these are what we stay alive for.

To quote from Whitman: ‘O me, O life of the questions of these recurring. Of the endless trains of the faithless. Of cities filled with the foolish. What good amid these, O me, O life? Answer: That you are here. That life exists and identity. That the powerful play goes on, and you may contribute a verse. That the powerful play goes on, and you may contribute a verse.’

What will your verse be?

The Metal Programming Guide Pre-Order

After many long months of work, “The Metal Programming Guide” is available for pre-order. Many people have been asking me questions and here are the answers to the most frequent ones:

  • The book is in Swift.
  • I don’t know if this will be available in an eBook format. I would be greatly surprised if it wasn’t. Every other book in the Red Book series has a Kindle or a PDF version available. If the book is available as an eBook, I believe it will be accessible.
  • I will be taking into account what happens at WWDC. As of today, the rough draft of the book is 75% complete. That translates to 15 chapters completed and five to go. I have a placeholder chapter for whatever new and shiny thing may be introduced at WWDC.
  • There is going to be sample code. I had some really tight writing deadlines and it was not possible for me to write the code concurrently with writing the book. I intend to spend the time between when the book is completed and when it’s released to ensure there is good informative sample code. I hope to continue to add to this sample code and maintain it as Swift and Metal evolve.
  • The overall composition of the book is about 50% graphics and 50% GPGPU programming. There are a few chapters in the graphics section that you will need to read if you’re only interested in GPGPU programming. Those are detailed at the beginning of that section.

One thing that I have learned while working on this book is that it’s impossible for this to be everything to all people. There are chapters in this book that have entire books dedicated to them. It wasn’t possible to write all of the implementation details of complex operations such as facial detection. My hope with the book is to basically prime the mental pump. I hope that if you encounter a topic you find interesting that I am giving you just enough information about it that you can somewhat wrap your head around it and seek out dedicated resources for it.

One of the biggest questions I have gotten over the last year is “Why should I know Metal?“ I am hoping that my conceptual chapters do a good job of answering that question for you.

I’m incredibly excited for this book. This is the book I have wanted to write since WWDC 2014. I thought that I waited too long and I missed out on being the person to write this book. I feel incredibly grateful for having the opportunity to take a year and really dive deeply into Metal. I knew since I started programming I wanted to learn and understand graphics. Getting to take that knowledge and apply it to thinks like data analysis and machine learning.

I loved math as a child. I felt like it was the language that helps us understand the Universe. I strayed away from it as a young adult because I had a bad experience with it and figured I was stupid and that it wasn’t for me. By bashing my head against vectors and matrices and seeing how you can use them to do amazing things has been a mental renaissance for me.

In life you don’t get a lot of opportunities to work on something you’re passionate about. I have been fortunate in my career to have several of these opportunities and I cherish every one of them.

Legitimate Complexity and The Art of Teaching

I have been working on a book on Metal for the last several months, since October. I am entering one final push and trying to complete the rough draft of this book by the end of June. That gives me about a week to write each chapter, which is really stressing me out and upsetting me tremendously.

The thing that is stressing me out is that I feel like learning Metal is like zooming into a fractal. Every time I think that I have a good grasp on the material, I realize there is a much more complicated layer of complexity underneath what I just learned. The complexity grows exponentially.

Metal is multi-disciplinary. It’s not just the framework. It’s all the things around the framework that you need to understand in order to actually create something useful. There are a lot of math concepts and a lot of 3D graphics concepts that most books on OpenGL don’t focus on because no one wants to write a 2000 page book that contains everything you need to know that absolutely no one will read.

I am frantically trying to edit myself enough to present a coherent chunk of information in each chapter without getting overwhelmed with all the things I don’t have time to explain or learn.

I’ve been an iOS developer for the last five years. I learned a lot of programming from Ray Wenderlich tutorials. Those tutorials are fantastic, but I feel like they give a false impression that anything anyone wants to do can be broken down into a 3,000 word step-by-step tutorial.

Right now I am trying to work through their 2D Games by Tutorials book. This book is a monster. It’s nearly 700 pages long. I have only ever gotten through the first 150 before I got overwhelmed and given up. I managed to get further than I had before, but it’s still incredibly dense. If you asked me what they could have gotten rid of to make it less overwhelming, I would be hard pressed to tell you.

A lot of things we do, especially when we’re starting out, are small and easily encapsulated. This lulls us into a false sense that everything we do will be simple and easily encapsulated. We develop sound byte memories where if something can’t be spoon fed to us in ten pages or less, then we get muddled and confused. This severely limits our ability to work on anything more complicated.

I am absolutely not picking on Ray’s site. It’s an amazing resource and the reason the tutorials are set up the way they are is because of this issue of us only being able to handle a certain amount of complexity. His site is working with how we process information rather than being a source of bad habits. I have nothing but admiration and respect for the writers on that team and I do not want this to come off as me bashing them or saying people who learn from that site are not real developers. I am simply talking about how for the last few years I have lulled myself into believing that everything can be broken down into easily digestible chunks when not everything can.

At this point I am trying to figure out how to expand my brain’s bandwidth so that I can tackle more complexity than I am used to. It’s incredibly difficult to do so. Not only am I trying to figure out something incredibly complex, I am also trying to process and package it into a digestible chunk by another person.

I have been reading a lot of graphics books and gotten frustrated at how abstract they are. I get frustrated that certain things are assumed and that nothing seems to be explained. I am now beginning to understand that once you reach a certain level of complexity there is a limit to how well you can convey that information.

This is an issue we are currently dealing with in our political sphere. Take the tax system for example. The tax system is an incredibly complex system that most people don’t really understand. When we go to vote for our representatives, it sounds good to say “Reform the tax system to make sure everyone pays their fair share,” but how to actually implement that is complicated. Something that is simple and sounds fair usually winds up being worse that the current system that is too complicated to explain in a 30-second sound byte on the evening news.

In programming we talk about precision and elegance. Those are concepts that do well in incredibly controlled and contrived situations. When you have to deal with things in the real world, stuff gets messy. There are edge cases. Things don’t behave predictably.

For a “simple” example, look at dates and times. There are 365 days in a year, 24 hours in a day, sixty minutes in an hour, and sixty seconds in a minute. Except when there aren’t. Every four years our year has 366 days. Then you get into leap seconds. Then you have Einstein’s Theory of Relativity where clocks that are shot into space are slightly off from their counterparts back on Earth. Things get wibbly wobbly awful damn fast and this should be a straightforward example.

I get that the world is so hopelessly complex that if we tried to understand the full scope of just how little is standing between us and total anarchy our heads would explode. We simplify complex systems as a means of being able to just cope with every day.

Right now I am frustrated because I am just beginning to grasp something that is hopelessly complex, but I don’t know how to package it in a way that is accessible to a group of people. I want to write a Rosetta Stone where someone can read through my book and totally understand a complex system, but that really isn’t possible. It would take a hundred pages to walk a reader through creating every piece they need to get a minimum useful thing up and running.

I am doing the best I can to present the information to someone in a way that will help them figure things out. I am trying not to be hard on myself for not being able to do an impossible thing. I know with several years of practice and working with this, that I can master it. I have to accept that there is no magic book that will intuitively teach you everything you need to know in order to do something legitimately complicated. I can just try to do my best to present what information I think your brain can handle and hope that you can find the next step to figure out the rest for yourself.

Special Announcement: The Metal Programming Guide

Hello all. For the last few weeks I have been hinting that I have a new project that I had not yet announced yet. I wanted to make this announcement at MacTech, which I did yesterday, so I am now publicly announcing this.

I am working on a new book: The Metal Programming Guide. If you are familiar with the OpenGL series of books like the OpenGL Red Book and the OpenGL Blue Book, this is going to be The Red Book for Metal. The publisher for this project will be Pearson/Addison Wesley, so this is not a self-publishing effort on my part. I will have technical editors and people breathing down my neck if I miss deadlines!

Back in 2014, when Metal was announced, it excited me tremendously. I did a series of conference talks on it throughout that year, but a little thing called Swift kind of got in the way of my learning path for Metal.

This year has been something of a disaster for me on a personal level and I didn’t get to accomplish what I had hoped to this year. Being given an opportunity to finally get to master Metal and write a book about it has given me hope for the future. I have always felt like Metal was something I was meant to do, but I wasn’t really ready to tackle it until now.

Right now I am trying to balance doing some short term contract work with attempting to work on the book. I hope to not run out of money before I finish the book, but I also want to avoid doing full time work that would prevent me from making progress on the book. We are very early in the process right now, but I am giving it everything I have to try and get this done in a reasonable amount of time.

I am hoping to be able to make weekly posts on here and my podcast about various aspects of Metal programming that I am not able to include in the book due to lack of time/space/things being out of scope.

Even though I have been a co-author on a number of programming books already, it has always been my dream to do an immersive book on a topic such as Metal. I am excited to learn this amazing framework and share that knowledge with everyone else.

I’m announcing it here on this blog because I have absolute confidence that this project will be successful. I’ve been waiting to do this for a long time. I do not plan to drop the ball on this. Bring it on!

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:

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.

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.

Soul Searching

January, 2014

I began my programming career in late December 2013. It started something out of necessity. Sometime around October I suffered from a nervous collapse that made it impossible for me to focus on my school work. I had dropped out. I was lying to my husband about dropping out of school because I was gambling on my ability to find a job around the time I was supposed to graduate. I was very lucky and something came through.

My only hope for my first job was that I would find something in iOS. In the Madison area, that was a pretty stiff order. Madison is a lot of enterprise Java, government, and health care.

I managed to find a job at a start-up where I was the oldest person by a decade. I was partially hired because my bosses were not old enough to drink and didn’t know any better about hiring people who have actual experience.

By January, I knew this wasn’t working. I didn’t get along with my programming partner and I knew I was going to be let go. I was okay with that. I knew it was a bad fit.

I did some soul searching at that point. I knew it was bad to lose your first job after two months and I did have some concerns with my long-term ability to be hired. I had a few choices. I could kind of fake it and find another, similar job where I would be equally uncomfortable, but possibly be able to fake it better. Or, I could acknowledge that I was in the weeds and I didn’t know what I was doing.

The people around me didn’t know what they were doing either, but I had enough training and visceral awareness to know that my programming sucked. I knew it could be better and I knew it would never be better if I continued to pretend like I knew what I was doing.

I sat down and started thinking about what I wanted from my career. There was only one thing I absolutely knew I wanted. I wanted to be Brad Larson.

Brad, for those who have not heard my enthusiastic ramblings about him, is the creator of GPUImage. Brad taught the Advanced iOS class at MATC the first year it was offered. The classes were, and are still, available to watch on iTunesU. While I was a student I heard a lot of stories about him. I heard about how Apple engineers told him that something he wanted to do with his Molecules app was physically impossible to do on the current hardware. He figured out a way around the limitation and he made it happen. He was the guy who did impossible things.

I didn’t know if it was possible or how long it would take, but I wanted that. I wanted to understand the language well enough that I could figure out a way around the limitations. I wanted to be a great programmer.

I reached out to Brad and told him that I wanted to do what he does and asked him for advice about how to get started. He was very kind and wrote a nice email back. A few weeks later, a contract opportunity became available to work with him on an extension of his Molecules app. I knew I was on my way out at my current job, so I reached out to him. I told him that I didn’t know anything but that I wanted to. I really wanted to make sure I didn’t misrepresent myself because I wanted to learn and I couldn’t do that if I pretended to know things I didn’t.

After this contract job, I spent time working on a book with Chris Adamson and doing a lot of conference talks. I was trying to get my name out there so that I could find a job. I talked about GPU programming and Metal because they were new things. I didn’t really explain them as well as they should be explained because I didn’t have enough experience with them to fully understand them. I gambled on talking about difficult and obscure technology to try and differentiate myself from all the other new programmers out there.

To my shock and surprise, Brad reached out to me about working for him as my speaking obligations were winding down. I did it. I accomplished the short term goal I made at the beginning of the year to find a programming job with a great programmer so that I could get better and be a great programmer too.

January 2015

Let’s jump ahead a year.

At the beginning of this year I initiated a divorce with my husband. Things had been difficult for a long time. My goal for a few years had been to find stable employment that would allow me to end the marriage.

I do not want to badmouth my ex-husband. Our divorce was amicable. He was a friend before we were married and he continues to be a friend. We had a lot of trouble and I honestly wish him no ill will.

I am bringing this up simply to establish that the last six months have been very difficult.

I have never taken care of myself.

I lived with my parents until I was 27 years old. I was essentially a perpetual student because I didn’t really understand how to find a job or support myself. I moved from my parent’s house to my husband’s house. The first few years I was working I had my husband manage our money because I was earning minimum wage and I did not want to know what my weekly paycheck was because I was afraid if I knew how little it was, it would be easier for me to mentally justify calling in sick when I didn’t feel like going. I was unemployed from 2012 for most of the rest of our marriage. I have never budgeted my money. I have never paid my own bills. I never lived on my own. I don’t think I filed a tax return until I got married because I earned no income.

The last six months have been difficult. It’s been hard trying to learn things that most people knew when they were 16. It’s been hard being away from my pugs so much every day. My house is still a mess because I am simply too tired and demoralized to clean it. I don’t think I’ve put my laundry away since February. My ex-husband was actually so appalled by my inability to care for myself that he cleaned my kitchen one day when he was here picking up some of this things.

The last six months have been physically and emotionally exhausting. I have had bouts of depression that I have spoken about on this blog before. It’s been rough.

Because things have been rough, I have been letting a lot of things go. One of those things has been my focus on my long-term goal of being a great programmer.

I have barely been getting by.

I have had weeks where I have barely gotten anything done. I have felt a great deal of self-hatred and fear about losing my job and independence.

At a certain point it became easy to rest on my credentials. I wrote a book. I was invited by Saul Mora to interview people for NSBrief. I had lots of people who knew who I was. I was given some cache for being a great developer because I had credentials. I didn’t want to think about how little I actually knew because it was too fucking demoralizing to deal with. So I pretended. I even convinced myself that I was as good as I needed to be. I got careless. I stopped trying because it was just too hard to deal with.


I am not doing this any more.

I am tired of what I have been doing for the last year.

The reason I told my long, rambling story at the beginning of this post is because I feel like I am back there now. I feel like I have two choices about how I can proceed from here.

I can either decide that I learned enough and keep hiding behind my credentials. I can learn fast enough to keep up with things, but I won’t ever become the developer I wanted to be. I will have to keep pretending like I know more than I do.

I don’t want to do this anymore.

I want to be very clear about a few things.

Chris wrote most of the book. My name is on the book and I wrote three chapters from the book. I wrote the Debugging, Testing, and Photos chapters. Two of those chapters didn’t really require me to add much to the code base. When I had to tackle the Photos chapter I had to fly out to CocoaConf Boston to work directly with Chris on that chapter because I was not familiar enough with the code base to write the chapter by myself. I needed help with the Core Image code.

Chris worked on the book for two years before I was brought on. I think my presence played an important role in getting the book done. I contributed to the book. But, I feel that I have received more credit for the book than I am due. I haven’t read the book all the way through. I am not comfortable with most of the concepts in that book.

I am tired of waiting around for someone to figure out that cut to the front of the line. I am going to be proactive and admit that I don’t really know that much. I have never written an app of my own. I have focused on some very obscure and esoteric low level programming. For a developer who has only been working for a year and a half, I am fairly advanced. However, I have a long way to go.

I have realized that I have been squandering my opportunity of working with Brad by being too proud and afraid to ask him for help. I have been ignoring things that I don’t understand. Yesterday I asked Brad about what provisioning was. He could have explained it in a sentence. Instead, he took an hour to show me Instruments and how it could be used to analyze one of his projects. I felt like my world went from 2D to 3D. I realized that there was a whole dimension of being a programmer that I used to be aware of and wanted to explore that I had abandoned because I was tired and demoralized and didn’t want acknowledge how little I know. I felt exhilarated and deeply, deeply ashamed.

I do not want to be afraid anymore.

I am working on my own personal application. I am going to do my best to write about that process on this blog. I will be talking about concepts that are probably covered in the book that has my name on it. I will talk about things that most people who have been programming for five years already understand.

I want to go back to the spirit this blog was created in. I created it to document my progress as a student to a professional. True to my roots, I am a perpetual student.

I am going to ask more questions. I am going to delve deeper and try to understand better. I made time for what was important for the first half of this year. Now I need to get back on the track I decided a year and a half ago. I need to stop worrying so much about my exposure or my reputation and worry more about my skills. If my reputation suffers because I want to shore up my weak points, then I probably deserve it. It’s painful to admit that you don’t measure up, but if you won’t accept reality then you can’t change it.

I hope that Brad will continue to be patient with my questions and continue to go the extra mile to expose me to things I wouldn’t have thought of otherwise. His commitment to excellence pushes me to be better and even though it is painful sometimes, it is something I asked for that is rare in this day and age.

Janie’s Insanity Log: Saturday, November 8, 2014

Time: 7:45 am
Tea: Adagio 4 Seasons: Autumn
Current Music: Soundtrack to Revolutionary Girl Utena

Hello. Over the last month or so people ask me what I am going to do this weekend and I invariably say that I am trying to finish my book. I always get the same response: “Wait, you’re still working on that thing??”

Yes. I am still working on that thing.

I am tired of working on that thing. I want it out of my life and into the hands of people who will use it for its intended purpose of chaos and destruction.

Problem is that when I try to make myself sit down and write, I want to be anywhere other than in front of my computer. I start crawling the walls and try to gnaw my own arm off to escape.

So, I am going to the super counterintuitive thing of writing my thoughts down to avoid having to write my thoughts down. I am going to periodically write my mental state here over the next 48 hours or so so that I can share my psychological degradation with the rest of the world. Yay!

This will either be entertaining or it will be a disturbing, incoherent rambling mess. Or, if I am lucky, it will be both! Let’s see what happens.

Time: 7:55 am

I have realized that my chapter goals may have been overly ambitious. I have chosen three frameworks that could each justify their own book. This is a poor decision. I have removed one framework altogether and I am now figuring out how to adequately write the rest of the chapter.

I made the somewhat impulsive decision yesterday to go to CoocaConf Boston to spend some time with Chris working on the book. I started a job a few months ago where I can actually talk to another programmer about the issues I am having and it has increased my productivity tremendously.

One reason this has been taking so long is that life has gotten in the way. It’s been hard to say I am going to sit in front of my computer and write about something I am still figuring out when it has been nice and sunny outside and I would rather be doing other things. Having another person there to bounce ideas off of and who knows you are supposed to be working because they are in the same boat is an invaluable thing. We have been limping along this way out of necessity, but I really need to work with Chris in person, so I am sacrificing some of my royalties in order to make sure the project gets done the way I want it to be done.

Time: 8:00 am

Realized I am spending time I should not chatting on Twitter about what a cool idea this post is and all the awesome crap I am going to do with it. Gently directing my attention back to the task I have to do.

Time: 8:05 am

Reconnoitering the task at hand. I am trying to figure out the best way to proceed here. I have an idea about what I want to talk about and what project I want to complete by the end of the chapter. I know that some amount of the chapter is going to be structural stuff and the rest will be what Chris likes to call, “clicky-draggy” stuff of explaining how to set things up and show actual code.

I don’t want to work on coding the project by myself because I want to work with the person who has done a lot of the work on the code, which is why I am going to Boston. However, I don’t think I will get very much done if I don’t at least begin to explain some of the “clicky-draggy” stuff.

I found a project very similar to the one I want to explain by the end of the chapter. I am tentatively planning to throw code in the chapter that I will tag to remove when I replace it with the actual code I am creating for the project. This will give me a sense of how long this chapter will be. I will also have to account for screen shots that will be taken later when I get the project working.

I feel bad that I am having trouble doing a remote project by myself. I worked alone out of my house for a year and half while learning programming and I could self motivate for that. To be fair, I never completed a project that was released to the world when working by myself. Also, working with another person on code they primarily wrote is an entirely different skill set than just doing your own thing.

I am an inherently social person. I like talking to people about their code. I am not one of those solitary programmers who lives in the basement staring at a screen. If I don’t have anyone to talk to about things that interest me, I kind of wilt and get depressed. I had hoped to work more directly with Chris on the book, but we both had a lot of curve balls thrown at us and it is understandable why it wasn’t really possible to spend an hour a day chatting on Skype about the book. I am hoping that working on the project together in person will accelerate the process of getting the book done.

Time: 8:15 am

Oh! Student Council elevator song from Utena is playing!

Touga: If it cannot break out of its shell, the chick will die without ever being born.
Miki: We are the chick-
Juri: The world is our egg.
Nanami: If we don’t crack the world’s shell, we will die without ever truly being born.
Saionji: Smash the world’s shell.

Sounds about right. Probably shouldn’t be listening to mind fuck anime soundtracks. What else do I have? Neon Genesis Evangelion, Puella Magi Madoka Magica, and Attack on Titan. This isn’t a promising development…

Time: 8:25 am
On second pot of tea. Already driving Chris insane with my pestering. Will leave the poor guy alone. It must be nice to be an introvert.

Time: 8:30 am

Holy crap! I actually started writing something for the chapter!

Time: 8:45 am

Went looking for sandals. Floor is gritty and covered with various pug debris. Resisting urge to procrastinate by trying to clean my office. I am looking forward to deep cleaning the living crap out of this room when I get done with this thing.

Time: 9:00 am
Current Music: Soundtrack to Puella Magi Madoka Magica

Succumbed to the temptation to clean when I went to refill my tea and saw lots of dirty dishes in the sink with a dishwasher full of clean dishes. Feel slightly better that the kitchen isn’t a complete mess. I should probably eat at some point in the future…

Time: 9:30 am
Current Music: Soundtrack to Attack on Titan

I figured out something I was confused about and didn’t understand about the framework, so I actually got some stuff written. Now I need to determine if this is something Chris explains earlier in the book.

Also ate the other half of my leftover crispy chicken sandwich and french fries from yesterday. I am sad that this is probably going to be the healthiest food I eat this weekend. I am keeping a food log of all the horrible things I am going to put in my body to punish myself for not getting this done sooner.

Time: 9:45 am

Got sidetracked by an argument with a friend of mine online about whether the TV show Scorpion is offensive and stereotypical to smart people. My friend is on the autism spectrum and is thrilled to see people like herself on TV. I am annoyed that it is assumed that if you are a smart person you must be completely socially inept. Wait, I am supposed to be writing now, aren’t I? *grumble*

(But seriously, if one piece of your dialog in the pilot is the main character telling the young white guy with glasses in the back of the room that he is a programmer and the guy asking, gee, how did you know, and the main guy saying lucky guess, guess what?? THAT IS A FUCKING OFFENSIVE STEREOTYPE!!!)

Time: 10:05 am

Having an existential thought about whether or not what I am writing is correct and if it isn’t, would anyone ever know? Wondering how many tech books I have read where the author was completely talking out of their ass and doesn’t know what they are doing only to figure out like years later that something they wrote was completely wrong. I guess it doesn’t matter because anything written about Apple tech is inherently ephemeral.

Time: 10:20 am

Got slightly derailed by a flare-up of my involuntary muscle twitching. Beginning to wonder if it might be an allergic reaction of some kind. This only happens when I am at home. When I travel to conferences or I am at work I rarely have any issues. I hope I am not allergic to my pugs. That would suck to the extreme.

Time: 10:45 am

The Husband returned from his outings. He brought me hacker food. He brought pizza, a case of Mountain Dew made with real sugar, and french silk pie. My digestive system is about ready to strike and walk off the job in protest. This will be fun.

Time: 11:45 am
Current Music: Soundtrack to The Rocky Horror Picture Show

Crap. I got pulled into conversations with people on Twitter. Chris seems to have gotten over my annoying him this morning and we are talking about Revolutionary Girl Utena. Also talking to people I need to connect with in Boston while I am there.

I am making progress on the book. I have written quite a lot so far. I have mentally broken thing up and I am putting the pieces together. I had to spend some time doing a little research, but I am able to find the answers I need fairly quickly and not falling down too many rabbit holes. Also not stressing myself out too badly or crawling the walls trying to escape. Plus, it’s almost noon and I haven’t thought about how long it is until I can open a bottle of wine, so yay to that.

Sadly, getting to the part of the book I am going to have to hack somewhat because it involves code I haven’t written yet. I want to write some of the glue code about the process even though I haven’t done it yet. Sigh.

Time: 12:00 pm
Tea: Adagio Raspberry Black Tea

On my third pot of caffeinated tea. I might want to consider switching to something herbal in a little while or else panic attacks will happen. I wonder if I switched to Mountain Dew if that would still result in panic attacks because caffeine is caffeine. Should run experiments on the pugs.

Time: 12:30 pm

As I am writing the chapter, I am realizing I might be approaching the project incorrectly by trying to describe doing it before creating it. I am taking a bunch of notes in the chapter to try to come up with a list of requirements for the project so I can start working on it when I am in town with Chris. Also need to look over the code better to figure out how to integrate this into what we have so far.

Also, figuring out that I am hungry. Grabbed a random pizza from the freezer and preheating the oven. Also took a can of Mountain Dew and threw it in the freezer to get it cold quickly. I am mentioning it so that when I inevitably forget to take it out of the freezer and it explodes there will be foreshadowing of that event.

Time: 1:30 pm

Managed to collaborate on a plan of action with Chris so we can make the most of our limited time in the same physical plane of existence.

I am creating a set of software requirements for my sample code. I am also looking over all of the code we have thus far to strategize about the best way to approach the code and the organization. I might just stub out some space in the book where I describe what is going to happen in each place.

Also made pizza and switched from tea to Mountain Dew (no, I didn’t forget the can in the freezer and we had no explosions.). Haven’t gotten super hyper yet. Give it some time.

Time: 2:15 pm

I am approaching the end of what I can do on this portion of things by myself. I am getting an idea about how I need to approach my project, which is what I will do for the remainder of my day. I am planning to tackle another part of the project tomorrow. Hopefully I will be able to put together a software requirements package that will allow me to just sit down and code my project when I can collaborate with Chris and we can get this stupid thing done and shipped.

Time: 2:30 pm

Bah. Tired. Time for first bath. Normally I would read tech books in the bathtub, but I am trying to avoid contaminating my focus with any of my other hobbies. Will probably just read historical fiction book about Henry II and Eleanor of Aquitaine. Pondering whether I want wine or not…

Time: 4:00 pm

Took my bath. Got really sleepy. Was really hoping that I could take a nap. No such luck. I really miss taking naps. I haven’t been able to have one in a while because when I go to lie down the involuntary twitching comes back and I can’t sleep.

Today has been a fairly productive day. I am trying to spend what energy I have left outlining the things I need to figure out to implement the first part of this project.

Going to navigate away from my desk. My arm and leg are jerking so much that I am afraid of falling off of my ball. I need to go to bed or somewhere that I am not going to fall over and hurt myself.

Tentatively going to call it a day unofficially. Going to get up tomorrow and continue on my odyssey of writing. See you then!