CS Graduates (and not): A Question

twitter logo github logo ・1 min read

As someone who's gone through the years of learning formally and getting a CS (or CS related) degree, what kind of skills would you think the general self-taught developer lacks?

On the flip side, self-taught developers, what kind of skills would you think the general formally taught developer lacks?

I'd really love to hear both sides of this!

twitter logo DISCUSS (8)
markdown guide
 

It's hard to generalize about this, because in all cases it depends on the person. Some self-taught programmers have way more theory than many CS grads I know. To paraphrase (good) Will Hunting: "You're paying all this money for an education you could have gotten for a $1.50 in late charges at the public library."

I can tell you some parts of the CS education that I received that I would have been unlikely to learn on my own, at least early in my career:

  • Algorithm design + analysis. Going through sooo many algorithms, learning how they tick, analyzing the bejeesus out of them so that I ended up with a "gut feeling" for whether an algorithm is going to need optimization (o-notation).
  • Lambda calculus + functional programming. They started me on Scheme/Lisp back in the day, and there's no way I would have started myself on that. I didn't start myself on that, in fact. Before college I'd only programmed DOS batch scripts + Pascal programs. But... functional programming is awesome, and getting exposed to a diversity of thought around programming approaches was very important to my development as a coder.
  • Network topologies + how networks function. It's amazing how much mileage you can get out of knowing WTF TCP and UDP are.

On the other side, here's a small sampling of things that I've picked up on my own that they never taught me in school:

  • Databases. I guess there was a database class? But it was optional when I went to school. Those are pretty important.
  • Javascript / HTML / CSS. Those things are covered very heavily by bootcamps, but the attitude in school was "Meh, it's just markup languages + a C variant. You can learn those on your own." Which was true.
  • Design. Nobody ever told me how to make a thing look nice. It was never a requirement in school. But now I make apps all day, and people want them to look nice. Thanks to Edward Tufte and many others, I'm not floundering in the dark on this one.

I'm really glad I went to school for CS - I knew I wanted to and I got a good education that's served me well. But I think the story is different for every person, so it's important not to draw lines in the sand or form camps where no such distinctions need to be made. We're all in the same boat now, after all, it doesn't matter where we got on.

 

Definitely! I love that paraphrase.

You make an interesting point on the diversity of thought in functional programming, do you think those 'thoughts' have changed since being in school to a working environment?

Thanks for your reponse, I really appreciate the insight. :)

 

Thanks! That's an interesting question - I'm interpreting you as asking whether I think the main approaches to + thinking about programming languages have changed since I was in school.

On the one hand, this stuff's all been around forever. Functional programming since (before computers, and object-oriented programming for decades at least. Imperative models are also pre-computer, and that's pretty much all there is, approach-wise, for what people are using in production.

On the other hand, each new language brings a new approach, and sometimes those approaches shed new light on these same old ideas. For example: Joe Armstrong published his Erlang Thesis while I was still in school, but at the time Erlang's approach to message-passing functional programming using Actors (or, as some would say, the original vision for object-oriented programming was novel. That architecture allows us to write gorgeous, distributed programs that have a previously-unseen level of fault-tolerance and modularity. Nowadays we also have Elixir, which adds a layer of beautiful syntax, and a suite of amazing tools, along with some new ideas, to that Erlang core. Neither Joe Armstrong nor José Valim invented functional or object-oriented programming, but they've pushed the needle for sure. Personally, my exposure to Elixir + Erlang has changed the way I write code in other languages as well.

I hope that answers your question somewhat!

 

I see, elsewhere in discussion, that you're apparently not a college-educated developer. If you're interested in some introductory instruction on the subject of functional programming and lambda calculus (as well as turing machines, finite automata, and so on), in a way not much at all like you'd get at college, I'd recommend an O'Reilly book called Understanding Computation. It's very good, and uses Ruby as an implementation language for some interesting stuff, but you don't have to be a Ruby dev to "get it" or use it. The book is very well-written, very approachable, and (in my opinion at least) a lot of fun.

 

It varies. I don't think me as a PHP developer in the mid-00s would have discovered searching/sorting algorithms, binary search trees, Big-O, or any of the number theory material on my own. The trade-off is that I'd expect more out of the standard lib (as I've seen CS students totally unaware that things like binary search and quicksort are already in the standard lib and have more mature implementations).

That's all I can think of. Full disclosure: I was self-taught, tried to do CS formally and hated it, so I switched to mathematics.

 

I attended college, but am not a college grad. I got distracted by Real Life (family stuff, mostly), and left college.

In college, I learned that most of the classes in college are taught very poorly. The primary benefit I got from college classes was ideas about what to learn. I learned much more quickly on my own, once I knew what I wanted to study or do (because doing helps learning as much as studying). In the age of online syllabi, though, you don't need a college class to get ideas for what to learn. Just browse university degree programs and syllabus listings.

As a comparison of things learned inside and outside of college, I learned a lot about what things need to be learned as a second-nature skill and what things just need to be understood. For instance, learning the ideas in a trigonometry class is important, and learning how to use those ideas is somewhat important too, but spending week after week in class doing stupid busywork is pretty much useless. Even if your job revolves around trigonometric operations some day, understanding how the stuff works (and why) is important but actually doing it by hand is not something you'll be required to do unless you find yourself in a post-apocalyptic survival-and-innovation scenario. Use a computer.

Some of the "why" of things working is best learned from a person who knows it and teaches it. I got that from precisely 1.5 college instructors; one did it as easily as breathing (the late Blaga Pauley, opera singer and mathematician), and another did it sometimes. Well-written books can help convey that sort of thing, too, but it takes a lot of reading to find the good books. Most college instructors could be replaced by shell scripts and flat-file "databases" for all the good they do in teaching the "why". Don't underestimate the importance of "why", by the way; that's basically the foundation of real innovation. "How" is just an implementation detail.

The biggest benefit of a college degree, of course, is that it opens doors. Even more than the degree, though, is being in college long enough to get doors opened in your last year: internships, startup partnerships with other students, letters of recommendation, and so on. Everything else can be gotten elsewhere, especially in the last ten years or so, though some of it requires a lot more work and comes with a bit less in the way of a support system of fellow-travellers and mentors.

In "the real world" (outside of academia, in other words), there are things you'll learn that you likely wouldn't in college. Some "best practices" kind of learning is best (or only) learned on the job, for instance; some other learning along those lines is best (or only) learned in open source development.

Consider good development process and workflow, for instance, which is typically not taught at college or, if it is, usually gets taught in a depressingly poor mutant form (or perhaps thirty years out of date). If you want the best waterfall development process education that money can buy, get NASA to hire you. If you want the best agile development process education that money can buy, bounce around through startups for a couple years until you find one that is really good at it. If you want the best organic, distributed project management education that money can't buy, get into open source development and find out how several different projects handle things, learning from the successes, failures, and so on, of different teams (hint: GNU and Red Hat projects usually aren't well-managed, from what I've seen; maybe someone else has better experiences there).

Of course, you can always get these parts of your education after college, or even during college, by getting a job in software development while going to school, assuming you can find a dev job at all before you have a degree. It's easier if you're working on a degree than just while not having any college your life at all, though (see "opening doors" commentary above).

I think our "higher education" system is pretty broken at present, by the way. Some less-broken replacement would be a very good thing to have, but if what you're interested in is skills, instead of those open doors and "paying your dues" (basically academia-as-hazing), the crushing debt that comes with a college degree combined with the "this isn't strictly necessary for learning" character of these learning institutions adds up to the modern university experience being well-nigh useless in the grand scheme of things. They are not the institutions of learning people believe them to be, in fact. They are institutions of How We Do Things Here. It takes far more discipline to learn on your own than under the crack of a whip at school, but the costs are lower and the rewards greater, ignoring the social gatekeeping practices that keep our decaying educational system relevant.

There are people within academia doing a very good job of elevating their parts of the university learning experience, but they're outnumbered and overpowered by those whose net effect is negative. I hope the benefit of ubiquitously available educational information on the internet meets the promise we see in it, because the alternative would deeply disappointing as our educational institutions continue to make themselves less and less educational.

 

I don't have a degree, and learned to program for three months before I enrolled in a coding bootcamp.

I'm glad I took this path since college/university wasn't the right educational format for me. (I also didn't know at the time I would like programming at all) Lately, however, I've been spending more time learning about topics like object oriented programming and design, functional programming, and (some) algorithms.

Would I have learned those in formal education? Not sure, but I'm hoping I would have. I know now that I love learning those ideas! I don't think I would be using or liking to learn a lot of computer science algorithms though.

As for what a "general formally taught developer lacks," I can't say since I haven't met a formally taught developer yet. 😅

 

I completely agree, in my opinion it takes a specific person who is able to learn through academia. I'm similar in the regard that college/university isn't the best format to learn from.

I've recently enrolled in the CS50 course through edX and I thought about the different perspectives from people who were formally taught to those who have taught themselves. So I really appreciate your response, thank you! :)

Classic DEV Post from Sep 5 '18

Vim won't make you a more productive developer

A case against Vim

Yokim Pillay profile image
I am a full-stack developer from Johannesburg, South Africa.
Sign up (for free)

dev.to is where software developers stay in the loop and avoid career stagnation.