I’ve been asked more than a handful of times where and how I teach myself a new coding language most recently being Obj-C and related pairing technologies and IDE of XCODE.
Time and time again I have disappointed my audience by telling them that I started with the very basics and that I did not do much more than just spend time diving deep into the existing material provided by Apple. Specifically I start with the Developer Documentation and went from there.
Why, then, is the answer that I give such a gross disappointment? Why do people look at me sideways and continue to ask as if my answer is not good and decent enough? They ask me for websites or online tutorials or paid curricula and I return their blank stare with my own. It’s as if they expected that being a seasoned software engineer excused me from having to learn the basics!
I encountered this question once more today and it was just another moment to reflect on this strange exchange and I have discovered the tragic truth that underscores their disappointment.
You see, the issue is that our culture and educational climate has created an atmosphere where people are taught to succeed at all costs, oftentimes with more speed than is warranted or healthy. The result? Stunted growth and the inability to really retain and learn the material soundly. They are incapable of learning properly the core concepts and building blocks of programming done right.
In short they are taught to be entirely dependent on shortcuts and technologies that help them bypass the learning process making them sycophants of the platforms themselves without learning the fundamentals of software programming. It’s as if they are looking for the “fast-track” or the “free pass”:
Don’t know what an “array” is or “inheritance” or object modeling? No worries! Just use this, and this, and this and you won’t need that knowledge and understanding!
This is so entirely sad and misses the mark so badly that it makes me visibly angry. If our goal is to train code monkeys that can copy-and-paste syntax that’s one thing but if we are to train and cultivate independent thinking and real engineers that’ll definitively impact and change the world then I think our calling must be greater and our dependency on teaching tools needs to diminish a bit and our goal to teach core concepts must increase.
It’s this cultural and personal hubris that gets in the way at times as well and our belief that learning the so-called “basics” is beneath us; that we are too good and too bright to start from the real beginning. A great developer is a humble one, 10 out of 10 times. They know that they will never fully graduate from having to engage with a knowledge base or developer documentation to get their work done. They will utitlize the core essentials to do world-changing work.
But this shitty attitude still pervades our newly-minted developer ranks – is it any wonder we have 4-year Computer Science majors who cannot code themselves a “Hello World” if their life depended on it? What a sad state in the education and programming space! We need to do much, much better.
I lectured on this a bit (soapboxed perhaps) in a soft-skill training in our new Charleston-based Code School and I think it hit home. Heck, I wanted it to. It’s not enough that they learn all these neat tools that do the work for them without knowing the why and the how behind the curtain. There’s enough mystery in pragmatic programming already; there’s no need to create more through toolkitting the shit out of someone’s learning process.
I hope that we continue to do great work, teach real engineering practicum, and encourage independent, opinionated, and passionate software programmers to rise to any challenge presented to them in the near and far future. Our economy and our technological future depends on it.
There’s nothing wrong with starting at square one. Nothing wrong with that in the slightest.