The Trick to Forgetting the Big Picture is to Look at Everything Close-Up

Any sufficiently advanced technology is indistinguishable from magic.
– Arthur C. Clarke

Back when I was a programming student, my teacher Eric told me that over the years he has learned and forgotten a dozen programming languages.

At the time, it was inconceivable to me that anyone could learn and forget so much. Two years later, I am shocked to discover that he was right.

Two years ago when I really doubled down on learning iOS programming, I worked on it eighty hours a week. I was working through the Big Nerd Ranch iOS book. They had a series of about five chapters putting together a table view that would display a detail view populated by a singleton.

Every day I would wake up and code this over and over again. The first time I coded the examples, they made no sense. I typed a bunch of words that didn’t set off the compiler warnings, ran them, and magic happened. The second time was not much better. But by the third for fourth time, I began to realize, “Oh, I am creating this object because later when I load this detail view, I will be showing all the stuff I am keeping in this object. This is where it comes from.”

At the time Storyboards Interface Builder wasn’t particularly good for things. If you listen to many people online, their assessment of this situation has not changed. I used .xib files for each of my view and my custom cells and did all of my transitions programmatically. It took me weeks to wrap my head around all of these moving parts to figure out how they worked together. It wasn’t enough for me to just have something work, I really wanted to understand it.

Over the last year and a half, I haven’t really worked with user interfaces much. I had a contract job where there was no UI in Interface Builder because it was a legacy project from 2008. Then I spent a bunch of time running around like a chicken with my head cut off trying to figure out shaders, which are a tiny subset of a program. Then for the last eight months I have been working on porting another legacy project to Swift. We are just now getting to the point where I am working with interfaces again. It’s been over a year since I dealt with interfaces.

I am working on my first application. It is going to be rather limited to start off with, but I have plans to add additional functionality over time, so whenever I finally get it out, no, that is not the final product, more will come later, so don’t give me crap about it.

I am working with HealthKit. In HealthKit, there is a HKHealthStore that you are only supposed to have one instance of in your entire application.

I have been trying to figure out where to make that instance. I know that it needs to be accessible through the entire application and that you’re not supposed to make a bunch of instances of the same thing. I also know you have to pass it along to a lot of different places. I know many people don’t like singletons and I don’t want to create one of those, even though I am pretty sure HKHealthStore is a singleton. I was trying to figure out how all of the controllers can know about something while minimizing global state.

I talked to Brad about this a bit and he was talking about how it should be created in the root view controller for the application because that is responsible for the views that are controlled by it. As he was talking about all this stuff, it dawned on me that he was talking about the same things I was bashing my head against two years ago.

It wasn’t like I had spent a week mucking around with this stuff. I spent eighty hours a week for MONTHS trying to piece together how all this crap worked. I can’t believe that after spending all that time and pain on these concepts that they were buried in some far corner of my brain.

It also made me wonder about all the people who are learning programming now who use storyboards because, honestly, they are easier to get things done quickly. If you just push a couple of buttons and things happen like magic, how do you get a full understanding of what is actually going on? It makes me wonder about what else I don’t know about because I came into programming relatively recently. I know that my knowledge of memory management is bad because it was never something I had to deal with. I came in around iOS5/iOS6, so we had ARC and GCD and a lot of other things that abstract out a lot of the lower level programming stuff from you. Will understanding how root view controllers own detail views go the same way? I know talking to a guy at my first job he didn’t seem to understand this concept and it drove me crazy. I guess I have gotten to the point where I don’t understand it either.

It frightens me about how vast the knowledge is of everything that happens within the iOS ecosystem and how incredibly difficult it is to remember everything because really delving into the low level stuff means that you don’t know how to get things done quickly in the abstracted level. Sticking to the abstracted level limits your ability to do anything really customizable because you don’t see how the pieces fit together.

I am hoping that over the course of the next few years I can figure out a balance that works for me. I hope I can remember enough about how things work that I can deal with the abstracted layer without fundamentally forgetting everything.

Your Pipeline is Broken

Yesterday I had lunch with a friend of mine who is smart and talented enough to have gotten an internship at Apple and is planning to go out there for a permanent position at the end of the school year.

We were catching up about all the stuff we have been doing over the last few months and I can’t remember how this topic came up, but she mentioned to me that a company in town was desperately anxious to hire every mobile developer our school produced.

She is not the first person to tell me this. I am very puzzled and confused by this information because it does not correlate with my own experiences.

I started in the mobile development program two years ago. I was at school as a mobile development student for three semesters. Each semester we have an IT Job Fair where local employers supposedly send representatives to connect with students looking for jobs or internship.

I noticed that every semester I went to this job fair it got progressively worse and worse. At the first job fair people would actually talk to you and answer questions. The second one people would avoid eye contact with you and were incredibly unhelpful.

I went to the last one purely out of spite. I simply wanted to see just how bad it had gotten over the last year. I was not disappointed.

Each booth has a sign on it saying what they are looking for. I found one company looking for a mobile developer. Every other company that was looking for developers was looking for someone who knew VB.Net. VB.Net was eliminated from our curriculum around the time I went back to school full time. No one there had ever even taken a class in it. There was also a shocking amount of people looking for COBOL programmers even though I have no idea how long ago that language was eliminated from the curriculum.

The only people even looking for Java, which I had assumed was a pretty safe language to learn, were recruiters. Yes, there were recruiters at the job fair. I guess they really don’t want to miss an opportunity to capture someone before they know better than to hand over their soul, I mean, resume.

So, back to this company that is supposedly desperate to hire people. They have a booth at the job fair. Back when I was just starting out I talked to people there about what I should study if I want to work for their company. They handed out data sheets and seemed happy to talk to me. At this last one there were two women at the booth gossiping. I was feeling like a troll, so I went over to talk to them. They ignored me. Having nothing better to do and being curious about what was going to happen, I stood there and watched them while they tried to pretend I wasn’t there.

When it became obvious that I wasn’t going to leave, one of them sighed and snapped at me, “What do you want?”

I told her I was looking for a job. She sighed again and rolled her eyes at her friend. She said, “Yeah, we don’t hire people. If you want to work here, go over there and talk to Robert Half and leave us alone because we are busy.” She then went back to ignoring me and picking up her conversation with her friend.

Aw, isn't that cute. She wants a job. Doesn't she know she has to fill out form BZ/ST/486/C and defeat the Minotaur to get a phone screen?

Aw, isn’t that cute. She wants a job. Doesn’t she know she has to fill out form BZ/ST/486/C and defeat the Minotaur to get a phone screen?

Yeah, I am not talking to Robert Half. Robert Half is evil and incompetent. Actually, I could replace their name with any number of other recruiters in Madison and it would still be true.

I have spoken to recruiters (back when I didn’t know any better) and I have been told that no one in town wants entry level developers. No one wants to hire someone who just got done with school. I was told that no jobs ever came up, but if in the unlikely chance they ever did, I needed to sign an exclusivity contract with one of the recruiters to even have a shot at it. I was speaking to about five recruiters as part of my unemployment obligations back before I decided to go back to school full time and each recruiter was only interested in getting dirt on what the other recruiters were talking to me about.

I stopped looking for jobs on job sites because every job posted is a fake job created by a recruiter to trick someone into sending them a resume so they can fulfill some quota. I have seen the same job posted over and over again, but it someone miraculously never gets filled.

I have tried applying for a job directly at this company. I have applied for jobs that I fit perfectly and I have never made it past the HR screening criteria to even receive an email written by an actual human being.

I found it was easier to get tech conference talks accepted, get a book deal, and find a job at a weird esoteric small company that builds fluid printing robots that is run by one of the best programmers in the world than it was to even get to first base with this company in town that is supposedly desperate for developers.

I thought that maybe things had changed since last year. Things in tech change very rapidly and it was possible that this company had gotten their heads out of their asses and actually fixed their problems.

I asked a current student if he went, and he verified my tale that no one there was actively seeking out mobile developers. He saw lots of people looking for COBOL, but no iOS or Android.

I am actively telling people attending school not to bother with this company because it is too hard to perforate the layers of bureaucracy protecting it from ever actually hiring a competent person for work they supposedly need done.

People, your pipeline is broken. I believe that it is possible that the executives talking to our school actually want to hire some of our students, but they are setting up impossible obstacles to prevent us from ever actually getting there. Sending representatives from your company to a job fair to basically tell anyone who wants to work for you to fuck off is not going to convince anyone that they really want to work for your company.

I guess I should thank these guys for making it so hard for me to get in. When I went back to school in 2010 I wanted to work there and have a nice, stable, mundane existence. I think if I had done that I would be bored to tears. Things worked out fine for me. I guess maybe they were doing something right by trying to keep people like me out. I will see what I can do to help the other people like me avoid being trapped by the endless recruiter bureaucracy.

My plea to the current students studying programming: Don’t fall into this trap! This leads to misery and despair. Build a portfolio. Reach out to experts in your field. Go to conferences. Do things that don’t pay you a lot of money immediately but build your skills and establish your credibility. Push yourself to do things that are hard and be comfortable with feeling that you are stupid. Be willing to learn better ways to do things. For the love of God, do not give your resume to a recruiter! They will hound you to the grave with four month contracts in Boise, Idaho programming in a language that died ten years ago. Choose your own adventure.

Don’t Tread On Me

I booked my flight for 360|iDev Min. I know if you read my last blog post you’d be under the impression that I had an epic road trip planned. I did. I don’t get to go on it.

Once again, I was pressured by my family to not drive my car. I was told it was too long. I was told my car was not reliable. I was told that it wouldn’t be cost effective.

If it were just this one incident, that would be fine. I found a reasonable flight and the impulse was probably a stupid one anyway. I am just annoyed that I am constantly being pressured to do things I don’t want to do by people who bear no consequences of the decision.

When I decided to go back to school for programming, my father was adamantly against it. He had a bad experience with a computer science class twenty-five years ago, so he hates programming. He pressured me very strongly to go to law school. He told me that I would never find a programming job and that I would suck at it.

My programming degree was a hundred bucks a credit. A law degree sets you back six figures. I paid for my programming degree. If I had caved to pressure from my dad, I would be six figures in debt and probably wouldn’t have a job. Or if I did, I would barely make enough to cover the student loan payments.

Why do people feel like they need to impose their world view on me? If I had done what my father wanted and fallen on my face, he wouldn’t bear any of the consequences of that action. I would. I would be the one holding the bag for the debt. I would be the one who wasted three years of my life that I could have spent doing something else.

Now that I am beginning to see my labors bear fruit he is more than happy to take credit for my success even though he fought me every step of the way.

Back in 2008 I realized that I had to take control of my life. I let my parents and other people talk me into doing things because it was easier to just go along with what other people wanted than it was to not only fight them for the right to do what I wanted, but to also then have to accomplish it on my own. After limping along like that for nearly a decade of my adult life, I realized I couldn’t do that anymore.

I am so tired of fighting my parents and my husband to be able to do the things I know I need to do. I despair that this is ever going to end. I am sick of being treated like a child who is somehow incapable of knowing what I want or how my world works. There is more than one way to live your life and just because I want to live my life differently doesn’t mean my way is wrong. I don’t think I will ever get to a point where I will be treated with respect or have any of my accomplishments acknowledged by my family. But you know what, that’s okay. I am not doing this for them. I am doing it for me. If I was doing this for them, I would be an underemployed lawyer right now instead of a moderately successful software engineer.

For the Love of Math

I want to ask everyone a question. Am I the only one who remembers that at one time they really loved math?

I didn’t always love math, or reading. I found both of them rather difficult my first few years of school. I had classmates who went to preschool or had older siblings or stay at home moms who had a small head start on me for reading. I was determined to learn to read and I quickly caught up and surpassed many of my classmates.

Square One Television

Square One Television

It wasn’t until second grade that I discovered my love of math. There used to be an educational program on PBS called Square One Television. I became obsessed with this show because it took all these arithmetic concepts I had trouble grokking and explained them in a way I could understand.

They also talked about such advanced topics as Cryptography and Tesselations. (I do want to apologize for the dated content, this was created in the 1980’s.)

This show taught me what a googol was before the spelling changed and became a search engine/Big Brother. Even today when I see a number that is the same backwards and forwards I get really excited because I know it is a palindrome.

Yes, that is James Earl Jones.

Yes, that is James Earl Jones.

Notable people like James Earl Jones and Weird Al Yankovic appeared and lent their talents to making math fun for kids. If you do watch any of the clips I have linked to, please to watch the Weird Al one, it is full of Monty Python homages.

So, if I loved learning math so much and I enjoyed being challenged, why did I major in journalism rather than something math related?

My first major in college was engineering. I was bullied a lot in high school and I had a year where the highest grade I got on my report card was a C. As such, I wasn’t accepted to any of the schools I really wanted to go to. I went to the University of Wisconsin-Platteville to major in engineering. The male to female ratio at the time was two to one. After attending a tech conference where the male to female ratio was fifty to one, that seems positively progressive, but at the time, it was a bit of a shock.

I did not fit in with my classmates.

Every class I had I was the only girl. No one would sit next to me. I had a circumference of empty seats around me. If I tried to talk to anyone, they would literally cry and run away.

I took calculus my freshman year and due to a lot of stress and social issues, I received a D. I don’t really remember anything we were supposed to learn after the first week.

Contrariwise, if it was so it might be, and if it were so, it would be, but as it isn't, it ain't. That's logic.

Contrariwise, if it was so it might be, and if it were so, it would be, but as it isn’t, it ain’t. That’s logic.

I felt like a failure. The thing that got me through high school was this mythological idea that I would go off to college and find my people who would love and accept me for who I was. Going and discovering that things were even worse there than they were in high school was a massive shock and disappointment.

I temporarily dropped out of college. I tried working at Border’s for a while, but that went badly, so with nothing else to do, I went back to school. I went to Madison Area Technical college to take some entry level classes to get my grades back up enough to get back into the UW system. I transferred to UW-Whitewater, where I graduated in 2006.

Trying to jump over the negatives to get to the positives.

Trying to jump over the negatives to get to the positives.

I bounced around majors a lot, but I knew for a fact I was not going to do anything math related. I thought I was too stupid to learn calculus. I thought my success with algebra and trigonometry was a fluke, that those things were useless anyway, and that I needed to pick something easy just so that I could get through college because I was told that having a degree in anything would get me a job. *insert hysterical and bitter laugher here*

Journalism didn’t work out. Neither did video editing, sound design, or doing commodity white collar work. Back in 2012 I felt beaten. I had no idea what to do with my life and I contemplated ending it.

Then a miracle happened in a place I did not expect.

I have spoken about how the worst job I had was one where I was told to pretend to do work. I wasn’t allowed to ask any questions and I was supposed to act like I knew a bunch of stuff I had no way of knowing. It was miserable. However, there was a silver lining.

While trying to find something to do that looked like work, I discovered Codecademy. Codecademy began at the beginning of 2012 with the promise that you could learn to code in a year. I had it on my radar, but I was too discouraged from trying to learn programming to give it a try. When I had to find something that looked like work, it fit the bill.

I discovered that all the things that had stymied me for years while I was learning to program all of a sudden went away when I was doing things over and over again and doing them for long, concentrated pieces of time. I could do something I gave up on ever being able to do. I felt joy, and more importantly, peace while I was sitting at my computer feeling the code flow through my hands and onto my screen.

When that job ended I made the radical decision to go back to school full time rather than find another job. I was tired of running. I was tired of feeling stupid. I was tired of being afraid of failing. I wanted to learn to code because I wanted to know I could do it.

The two biggest motivators for me learning to program were Core Audio and OpenGL. I studied 3D modeling and animation along with audio engineering. I wanted to understand how the programs I used worked. I learned all the low level stuff I could find to help me with this quest.

Then I hit a wall.

What on earth does this stuff mean?! Mark Dalrymple knows Greek, right??

What on earth does this stuff mean?! Mark Dalrymple knows Greek, right??

I wanted to program and audio synthesizer. I was lent some Digital Signal Processing books by a friend, but when I look through them, it’s all Greek to me. And yes, I literally mean Greek because there are all kinds of symbols that I remember somewhere in the back of my head writing out and drawing in notebooks back half my life ago that I had buried because the memory of them was too painful.

I am in between conference gigs right now. Got home from CocoaConf Columbus and immediately went to That Conference.

It has been something of a whirlwind and I am still processing a lot of the adventures I had on these trips.

One of the talks that I was most looking forward to was at talk on the Accelerate framework by Mattt Thompson. I really wanted to know more about it, but I walked away disappointed. Mattt said that you couldn’t really utilize the framework unless you understood the math behind it. My talk on GPU programming also had the caveat that you have to understand math in order to fully utilize shaders. I went to no fewer than three talks and one keynote talking about math and our lack of knowledge of it.

I want to do something about it.

My favorite book in seventh grade and my introduction to logic.

My favorite book in seventh grade and my introduction to logic.

I asked the Klein family if I could replace my poorly attended Debugging talk with a talk on math. I want to figure out the most common stumbling blocks people have with the various frameworks and try to explain math to people the way it was explained to me, in a fun and relevant manner so that it doesn’t seem so forbidding and scary.

I am slowly going back and trying to immerse myself in the math that fascinated me as a teenager. I am not doing this because I think it will get me a job somewhere, I am doing this because I miss how I used to feel when I got exposed to something amazing. There are so many secrets and wonders of the universe that are a mystery to me because I shut off a part of me that I couldn’t bear to look at any more. I am sick of being that person. I don’t want to be afraid anymore. I want my love of math back.

Jumping off the Boat

I have been working on implementing my app for school. I found a lot of documentation about how to code the parts of the project that I am doing. I have access to at least two people at a moment’s notice to ask questions to about my project. I theoretically have everything I need to get my project done.

I am having trouble making myself do it.

I know that the only person putting pressure on me is myself. I know that I have people who are happy to help me get through my project. I know that my deadline is a month in the future. I know I can make my project less hard if I can’t figure one part of it out.

It is still hard to work on.

I am afraid of failing.

For the last year all I have cared about was learning Core Audio. I worked my butt off trying to establish enough knowledge to be able to even approach it. When I was in Boston at the Core Audio workshop I felt exhilaration because I knew enough about what we were doing to understand everything we were talking about. I learned stuff, but I was only able to make those connections because I had a solid knowledge base with which to draw from.

I am afraid that I won’t get this done. I am afraid I will fail myself and my teachers. I am afraid I will fail my family who gave me the time and support necessary for this opportunity.

This reminds me of when I tried going scuba diving the first time. They took us out on this rickety boat over choppy waters for nearly an hour. I got into my equipment. I was ready.

They told me to jump off the boat. I couldn’t do it.

I stared at the short drop off the edge of the boat through my mask and I felt paralyzing terror. I knew that I could breathe and that I had a floatation device on that would immediately bring me back to the surface. I knew my wetsuit would keep me from being too cold. I just couldn’t jump.

I used the ladder to get into the water, but I didn’t actually go through with it. When the instructor wanted to take me under water and take my regulator out of my mouth and have me clear it I knew that I was going to choke. I was hyperventilating and I knew I would inhale sea water and have to get CPR.

There is so much to success that is completely mental. I know I am smart enough to do this project. I know I am a good developer and that I will have a great career, but doing something for the first time is terrifying. Finding the first real job is terrifying. Fearing that you will screw it up and never find another one is scary.

A lot of people, including myself, think that all we need is a shot. We have elevator speeches prepared in case we have 30 seconds with someone who supposedly can give us that shot. No one talks about what you do after you have their attention. It’s easy to think that if you could just have a chance that everything would work out. Getting that attention is the easy part. Delivering on your promise is where the work and the risk happen.

I have done everything I need to do to complete this project. I established my knowledge base. I absorbed my vocabulary. I forged connections with people who can give me advice. I have my app planned out and the design finalized.

I will not fail. I will do this. I will succeed.

AVFoundation

I began work on my Core Audio app yesterday. I had a whirlwind of activity the last week or so and yesterday was my first day to really sit down and work on my app.

One of the things that was invaluable to me to learn was how to translate a command-line application to an iOS application. Instead of creating a user data struct, you take those parameters and set them as properties. The methods then get placed in the View Controller instead of the main method.

With those vital pieces of information and a lot of sample code, I figured I was off. I knew I needed to figure out how to set up the recorder, so I looked at examples of how to do this. I had an example for audio queues and audio units.

Things turned out to be more difficult than I anticipated.

There was a lot of code that was either hard-coded for the command line or looked for parameters that were not going to be available on an iOS device.

I spent a few hours trying to cram a square peg into a round hole. It was a little frustrating and I started to feel discouraged. My “glow” from the conference was starting to wear off and I began to realize why every talks about how incredibly hard this stuff is.

I decided to attempt another approach. I knew that AVFoundation was created a while back to make things easier for people who want to do relatively simple things. I wanted the recording process to be easy because I don’t plan to do any processing with it until playback.

I found a tutorial on AVFoundation.

I spent the rest of the day working though this tutorial. This was some of the best time I spent on this project.

AVFoundation was designed to work with an iOS device. It was the right tool to use for the recorder. I could have spent a week wrestling with trying to make a different framework behave the way I wanted to. At that point I probably would have asked the Core Audio mailing list or Stack Overflow and everyone would have been like, “Dude. Just use AVFoundation.”

I think it is always worthwhile to explore the simplest way of accomplishing a task. It was possible that the tutorial would not have helped me find a solution, but I think that dedicating a few hours to looking down a path that might work is a wise way to proceed with something you have not done before.

I did not do any work on my app today. I had class this afternoon. I find it difficult to focus on learning something new if I know I am going to leave in a few hours. Instead I spent my time this morning doing a multithreading tutorial.

During class this week we talked about Core Data. I also saw a talk at CocoaConf Boston about Core Data that made me feel like a complete idiot. So I looked at Safari Books Online and I found a rough cut of “Learning Core Data for iOS” by Tim Roadley. It is a whole book about Core Data where you work through a large and complex program that showcases the capabilities of Core Data.

Core Data is hard, but having a large tutorial where I can read about something, type out code, and not have to make any of my own intuitive leaps is about as much as I can do on days I have to leave the house.

I am hoping to improve my toolbox to learn how to do hard stuff. I also want to figure out if Core Data is a good way to store and process audio data.

I have created a more realistic timeline of when I hope to finish my app. I am going to take the next two months to work on it. I am going to spend that time polishing my skills with debugging tools, instruments, version control…

Goal for the end of the year is to have a nice app to show prospective employers.

Further updates tomorrow!

Learning Core Audio

CocoaConf Boston

I went to CocoaConf Boston this past weekend. I feel very fortunate to have been able to attend this event. I won a ticket to the conference and I had a lot of help just being able to get there.

This was a life-changing weekend for me. I spent a day doing the Core Audio workshop with Chris Adamson. This workshop was one of the first times that I got into the flow with programming.

Don’t get me wrong. I really like to code. I have just noticed over the last few years that I wasn’t getting the same “high” I was getting when I understood concepts before. I would spend a while debugging a huge project and when I got it debugged and working I never felt like “Yes! I got it to work! I am amazing!” I always just felt like, “Okay, that’s done. On to the next thing.” While the project isn’t working I feel miserable and unhappy because I didn’t get it perfect yet. I started to feel like a masochist because I was going through all the pain but never got the emotional payoff at the end.

This past weekend was different. When I grasped concepts with Core Audio that I hadn’t known before I felt my mind expand. The sky opened and the rapture came. I was so high off of learning this code that I could not sleep for almost a week. I was completely wired.

I want to briefly explain my interest in Core Audio. One of my self-appointed titles is “High Priestess of Audio Programming.” I am not saying that because I think that I know more than most experts on the topic. Far from it. I am a beginner and I have a lot to learn.

I love sound. I want to fully understand it and get as close to merging with it as I possibly can. The best analogy I can come up with is that for me learning audio programming is like a hard core Christian learning Aramaic so that they can read the Bible in the original language. They want to get the direct words and meanings without being passed through the filter of a translator who might have their own agenda.

I know giving myself that title is probably flaky and arrogant. I will probably have to drop it at some point in the near future but I would love it if I can keep it with people knowing the reason behind it.

I was exposed to a lot of ideas this past weekend. I was exposed to the idea of writing a book and speaking at conferences. I got distracted by a lot of shiny objects and I got seduced by the idea that I am where I will probably be in a few years, but I am not there quite yet.

My goal is to be a hard-core, bit eating programmer. I want to master the hardest things I can find. I want to get as close to the metal as I can. I want to be the person who writes a language or a framework that everyone uses. I want to be Linus Torvalds or Ada Lovelace. I do not want to be the token female programmer who got hired for diversity reasons.

Woman Programmers vs Women Who Code

I may or may not have complained about this already (probably have), but I am annoyed by the recent women’s programming outreach programs. I like the idea in theory, but all of them are along the lines of, “Here! We can teach you Ruby in three weeks and you are now a programmer! Yay!”

You can’t master programming in three weeks. Sorry, but no. I don’t like things where you type in one line of code then lots of magical voodoo happens. I love C for heaven’s sake! I want to learn some Assembler and kernel programming. I want to learn more Linux and shell scripting and regular expressions. At some point in the future I want to learn the math that is being done by my computer for DSP so that I can understand the language of sound.

I wish that these programs would focus on longer-term goals. I wish that they would tell women, “Hey, this stuff is hard. Take 2-3 years and really focus on understanding difficult concepts.” Support them when they think they aren’t good enough because they don’t understand something the first time. No one does. I usually have to expose myself to something about three times before I begin to process it. I can seriously feel my brain rewiring when I am learning a new skill. It takes time. Throwing someone into a week-long workshop to train them to be a code monkey doesn’t count.

My First Real App

That being said, I am laying out my plans for my app. I know that it is one thing to say I want to be a hard-core programming geek, it is another to actually be one.

I want to make a synthesizer. I want to program custom audio units and put together a huge, complex graph of audio effects. I am not there yet!

I am trying to come up with a project that will take about two months to complete that is impressive enough to get me my first job. I need to make the scope small enough that I can get it done in a reasonable amount of time but also impressive enough to capture someone’s attention.

My plan is to make an app that is a sound recorder. When the user pushes the record button a modal view pops up that has a user interface that shows audio level metering and the amount of time being recorded. If you look at Logic, when you begin recording there is a green bar that shows the amount of time being recorded. I want it to look like that. This user interface is the most difficult part of my project and it will be done last.

After the user records their voice and dismisses the modal view they will be able to play their voice back with some effects. I have two sliders, one that controls pitch and one that controls speed. I also have three buttons that will be mapped to various audio unit effects. I am thinking about having a distortion unit, a reverb unit, and I need to determine the last one. I am going to look through the audio unit properties header file for something that looks like it will fit into the rest of the project.

I started getting all confused and turned around. Where do I start? How do I store my data? How do I make my user interface? There is a level meter parameter in Audio Queues, how do I map that to an animation? Do I need to learn Core Animation?

I spoke to my teacher Eric Knapp. He was imminently practical. He told me to start at the beginning. Make an app that records a sound. The next step is to play it back. Then go from there. When he puts it that way…

Systems, apps, and games need to start simple and then get more complex. You need to make sure that the simple things work first and then you add complexity. You can’t immediately set out to create a complex system or else it will fail.

Finally, after I get everything coded I want to try to design the user interface. I have a degree in video production and graphic design. I have not used these skills in a very long time because I honestly don’t want to be a designer as a living. I am a fairly sensitive person and when you are doing something creative you will deal with rejection a lot. I don’t love design enough to persevere through the vast amounts of rejection my work will probably receive. I know that design is a matter of taste and that if someone doesn’t like my work it doesn’t necessarily indicate that I am bad at what I do.

I do know enough about design that I can hopefully make my project look like I didn’t ship it with developer art.

I will keep updating my progress on this application. My biggest enemy is lack of focus. I keep hearing from a lot of different places that whatever I happen to be working on at any given point is wrong. I start worrying about hedging my bets and learning a few “safety skills” in case this whole iOS thing does not work out.

I can’t do that anymore. I have to put all of my effort behind one thing and have faith that it will work out. Doing a few things badly is worse than doing one thing really well.

Moving forward. Not looking back.

Chasing the Dragon

I am slightly concerned about my future at this point in time.

I am on my (hopefully) last semester of school. I am taking an iOS class, a JavaScript class, and a Java Class.

Each of these classes offers a different future.

JavaScript offers the future of doing web development. Web development is still very huge. Any business worth its salt has a website. Many people are developing apps for the web and using things like Phonegap to use JavaScript to create both iOS apps and Android apps.

Speaking of Android, those apps are written in Java. We currently have a mobile development degree geared towards Android where you take Java and Android development classes. Android is taking over a large portion of the market and Java is still very highly in demand at large companies in the Madison area who specialize in health care.

I feel I am at a crossroads. I know that the point of the programs at school is to make me as marketable as possible. I know enough different things that I should be able to get an entry level job somewhere doing one of these things.

7 of Cups

So many choices, but until you pick one, it’s all vaporware.

I feel paralyzed by choice.

I feel very much like this Zen Pencil’s quote. I know this might cost me a few jobs, but I do Tarot card readings and I am constantly fighting with the philosophy of this card.

The basic meaning of both of these references is the idea of choice. You have limitless possibilities, but once you take one step towards achieving one of these possible futures the other ones vanish.

You must make a choice. You might make the wrong choice. If you do, all other possibilities disappear. You could be the next Steve Jobs or you could make a bad choice and be no one.

I feel like I am supposed to keep my options open. I know I should do my homework like a good girl, keep as many choices open as I can, and look for whatever opportunity presents itself.

I can’t do that right now.

I want to learn Core Audio.

My first degree was in Journalism. I was a newscaster at a community radio station for three years. The first time I placed the headphones on my ears and heard my voice through the headphones over the air I knew my life had changed.

Over the years I lost my affection for news, but never for audio. I went back to school to learn audio engineering. I loved working with it. Things did not work out and I decided to go back to school to learn programming. I figured I made a bad bet on a disappearing technology and it was time to grow up and learn a real skill.

About a year ago I learned about Core Audio. I sort of knew that the programs I used for audio engineering were written in code, but it never really occurred to me that I could acquire the skills to write one of my own.

I am at a quandary. I love audio. I feel working with audio is my calling. I have felt that way for nearly two decades. So far my gut has not paid off.

How many levels of abstraction do I need to get to before I reach the right one? I feel like I keep doubling down on a bad bet assuming that it eventually has to turn around for me.

I feel wary. Everyone tells me if I master this one skill that I can write my own ticket and make a lot of money. I have heard this before. It has never paid off.

How many times do I believe what I hear before realizing that it is wrong?

I can’t ignore my gut. It tells me to keep moving forward. I am ignoring my classwork to learn audio programming. My rational brain tells me to learn Java and get a nice 40-hour-a-week healthcare job with two weeks of vacation and try to have a normal life. My gut tells me to keep moving forward with audio programming. Guess which one I am listening to.

Audio Queues and Audio Units

I am working on doing a Core Audio project for two of my classes this semester. I was supposed to do an internship, but nothing panned out. I am also supposed to work on creating an app to put on the Apple App store for my Professional iOS development class.

Currently I am working my way through the book. I am trying to get all the way through before October 23. I won a ticket to CocoaConf (thanks guys!) and before the conference Chris Adamson is doing a workshop on Core Audio. I would like to get through the books once before I go to his workshop. I know part of the point of the workshop is to learn Core Audio but I would like to be prepared and get as much out of that experience as possible.

Initially I was going to do a synthesizer app. I met a person at a CocoaHeads meeting who has been programming them for the last 15-20 years. He and I met up for coffee and he showed me his code. He also told me he has been working on his synth for four years. I tend to bite of more than I can chew. I have reassessed my project to try and accomplish something a little more achievable.

I am now focusing on creating an app that records your voice and plays it back. After I get it to that point I can add a levels meter and maybe some effects.

The first half of the Core Audio book goes over some audio basics and talks about how to create a recorder using audio queues. Perfect! I can take the command line programs as a starting point and integrate them into an iPhone app that has a user interface.

However, from past experiences, I have found it is a good idea to continue learning things before prematurely ending. I am glad that I did this.

The middle of the book is about audio units. Audio units allow you to do things that queues do not. If my plan was to just create a recorder that plays back queues would have been sufficient. Since I want to add effects to my app, I will need to utilize audio units.

So my progress is that I am about halfway through the book. I have found some working space and I am able to focus on plowing through the book. I really want to focus on just doing this, but I have other classes I need to work on as well. I have not worked on my JavaScript class for a week and we have a group project in the iOS development class that I have let slide. I am not even going to get into my Java class!

I think tomorrow and this weekend should be spent on some of these other things. I know I need to focus on Core Audio, but I can’t just drop the rest of the balls I am juggling. I am learning to delegate my activities and to make sure I don’t let anything slide for too long.

I also would like to start adding some small audio projects to my GitHub account. I need to figure out what will be indicative that I know how to do this without putting anything too valuable up on there. I think the former will be harder to pull off than the latter.

Twitter App Tutorial

One of our assignments this semester is to create an App.net client for class. I have been looking for some clear-cut explanations about how to make a microblogging app utilizing an API, but it has been rather challenging. Most of the documentation out there has been about how to create a Twitter app.

I decided to spend today working with this tutorial explaining how to create a simple Twitter app.

I have to say, I am disappointed with some of these tutorials. Every time I try to run one it crashes on me with weird unknown errors. The debugger says that the code is fine but then when I try to run it the program crashes.

For this tutorial I was able to download a completed version of the code and run it on my machine. It looks like the same thing I have been doing, so I really don’t know. I am wondering if I have something set up incorrectly in the new Xcode.

One thing I will focus on soon (probably not today) is getting better at debugging things. I will add more NSLog statements and breakpoints to see exactly where my code is going off the rails.

Anyway, back to the point of this exercise. I hoped that doing this tutorial would give me ideas about how to do an App.net client. Sadly, this does not. There is a built-in framework for both Facebook and Twitter that was created by Apple with a lot of methods coded in to maximize productivity for coding clients for those two technologies.

Interestingly, there are three microblogging sites that the frameworks supports. The third one is Sina Weibo, or the Chinese equivalent of Twitter.

I did notice that the site I am going to for most of my tutorials has everything in either English or Mandarin. I guess this is fitting in with Apple’s apparent market strategy of targeting China. I should get my butt in gear and actually learn Mandarin one of these days. I just worry that knowing Chinese will be the equivalent of learning Japanese in the 80’s.

Final verdict: This tutorial would be fine for someone wanting to write a Twitter client but it doesn’t help me very much currently with my App.net client. It does give me an idea of what a social networking framework would include and it might indirectly help me when we get into ADNKit and some of the other user created frameworks out there.

I will probably come back to this one when I start delving deeper into the finer points of debugging. There is no reason that I can see why my code would have crashed and I need to delve deeper into figuring it out.