views:

689

answers:

15

Duplicate of: http://stackoverflow.com/questions/126583/as-a-programmer-without-formal-cs-training-or-a-cs-degree-what-am-i-missing/

I'm working writing C# .NET applications for a small company. For those of us who don't have a degree in programming, what have we missed that could take us years to find out teaching ourselves?

I have a degree in Electronic Engineering so it's not like I left school at 16 and sat down with Visual Studio. I've covered some basic embedded C in my studies, algorithms, control systems, maths etc. I just feel like there must be things that I should know to do this but don't.

+1  A: 

I did leave school at 18 without any degree and I've spent 10 years now programming professionally with a variety of languages. I've asked this exact question of a few people who did get Comp. Sci. or Software Engineering degrees. So far the only thing I've discovered I missed out on was the general life experience one gets from attending university.

I discovered a few people who did Comp Sci or similar and then went on to a career in an unrelated field. It may be that a Comp Sci course will help you decide if this is really for you.

Colin Pickard
I'm wondering if you could say that if you work in a scenario where algorithmic concerns are very important.
akappa
University might be a good place to learn algorithms; I've never yet heard anyone say I missed out by not having learnt that, but then I don't know many games or scientific programmers.
Colin Pickard
+1  A: 

It's hard to tell what you missed since there are no secrets taught in programming courses that cannot be read elsewhere, too. But in my experience, people without the right eductation often have problems to grasp concepts like recursion, proper object orientation etc. And also they often use their own naming schema etc. instead of following common practice.

ammoQ
Of course the opposite can also be true - sometimes people with this education have a hard time adjusting to certain differences or constraints of programming in the "real world".
Colin Pickard
I agree with Colin, some 'educated' people know so much about theory that they just can't follow naming standards
victor hugo
True, educated people often have a hard time accepting that in real world, things are just not as easy and perfect as they were in theory. Sometimes they are so sure of themself that they try to make everything "perfect", even if that means that their part of the program looks very different than the rest. Which obviously sucks since no matter how bad the rest is, inconsistency only makes it worse.
ammoQ
+8  A: 

Well ... Big O notation feels like one of those things that are typically taught, but that you might not pick up on your own.

Discrete mathematics might also belong in that category, along with statistics perhaps. Those might be in a EE degree too, this answer is perhaps a bit too pessimistic. :)

unwind
Discrete methods was one of my favourite parts of the course I did, and I still find it very useful.
Shane MacLaughlin
I've to say that Big O notation is a thing you could learn and apply in just one day, unless your brain is math-lesionated ;)
akappa
+2  A: 

A formal training in Operational research, Computational complexity, some "advanced" algorithmic stuff (cache-obviousness, data mining, etc.) and a culture about concurrency issues, which are typically covered in OS and programming courses. Maybe even some good-pratices in programming, but I think you've already learned that.

Those might or might not be important, based on your current work, but I think that your degree enables you to self-study those things.

akappa
+1  A: 

With a degree you'll have better chances to get higher paid jobs. You would have learned a lot of theoretical stuff too, which greatly helps to identify shared constructs in different frameworks/programming languages. One thing that helps me the most is the broad background info that you gather while studying. You can answer a lot of questions regarding mostly unknown topics just by comparing it to more general things that you've learned before.

Patrick Cornelissen
A: 

When you write small applications, it is somewhat easy. When the projects get bigger, you will get overwhelmed with problems, if you don't know how to apply architectures, good designs, and so on. When people study, it is also kind of practising. It is harder to convince employers to hire you if they think you are or might be still in the studying phase. Also there are skilled professors in universities who know a lot of important information that you might not have thought by yourself, but that they could share to you.

Silvercode
I got this job with my EE degree, but have been writing software to support the hardware for a few months. I'm not sure yet whether I would want to work entirely on software!
Tim
I disagree. Programmers must always continue to learn. Any employer who thinks I'm done studying would be awful to work for.
Colin Pickard
Anybody in the Electroics/Computing industry who wasnt interested in learning new things would soon be out of a job
Tim
Of course you should continue studying. I meant that it is different to be ready with a degree than not. Some employers are suspicious even if you trust your skills but don't have a degree.
Silvercode
+1  A: 

Probably the only thing you are missing out on is some theory, although you will have gotten some of that with your EE degree.

The use of theory in practical programming is hotly debated, usually with those without degrees on one side insisting they aren't missing anything and those with degrees claiming they are. I prefer to take the middle stance of you don't need a degree, you won't learn secrets that are impossible to find elsewhere and what you do learn isn't required for a lot of commercial (as in non-academic) programming positions. What it does is help with a lot of things, such as knowing why a task is difficult or impossible or how some particular thing works. It also acts as a nice foundation to build the rest of your careers learning on.

workmad3
+2  A: 

I think it is more about the way our brain operates - how it analyzes, searches/finds solutions etc... The difference between programmer with a degree and without it smoothes as the time goes and your experience becomes more important/informative/solid to base your thinking on.

Svitlana Maksymchuk
A: 

I started programming professionally on a full time basis after leaving school in 1984, and did not do any third level computer related course until the early 90s. The main subjects I focussed on were management in IT, and discrete mathematics, both of which I have found very useful. The actual programming part was pretty weak, Pascal from text-book find of stuff. Some of the database classes were quite good however, normalisation, relational algerbra, etc... as were the system analysis and structured design.

My feeling is that without a rigid cirriculum, you are liable to skip much of what you might think of as boring that is actually very useful.

Shane MacLaughlin
+4  A: 

Think on what you have not missed: girls, parties... just joking ;)

I think having studied EE the only areas you would need to reinforce are those related to Software Architecture: UML, patterns, design...

Yes, there are other areas you'll miss (compilers, networks, etc.) but the knowledge you might use from them you'll learn working, not a big deal.

Pere Villega
I think that EEE courses probably cover more networking than CS courses. I did a course that covered both EEE and CS, the EEE classes were much more in depth than the CS ones. The rest of your answer is spot on.
Dave Turvey
Ops, my bad, had no idea they covered networks so extensively.
Pere Villega
A: 

Just guessing about your situation, of course, but I most often find that "I just learned to program, and have been practicing every since" programmers (a class which includes me, I might add) are sometimes short on the tools supplied by a compilers course (see Learning to write a compiler for resources). The recognition of this crept up on me slowly, but looking back on it this is huge.

My second worry for informally trained programmers is understanding how computers work at the low levels, but if you are doing embedded work, I imagine that you have (at least!) a good start in that area.


I suppose it sounds useless when (in the comments) I describe this as "the course on writing compilers". Afterall, you probably figure that you don't intend t write any compilers, so you're OK. But that course really does provides a set of powerful and general tool that you can leverage in many situation. See How much of the compiler should we know?.

dmckee
what do you mean by "compilers course"?
Tim
The course on how to write compilers. Lexers, parsers, and what to do with them. There are plenty of resources on SO for this stuff, too: http://stackoverflow.com/questions/1669/learning-to-write-a-compiler and others...
dmckee
+3  A: 

I attended a university, but majored in psychology and philosophy. Ten years after I left school, I picked up computers as a hobby and spent a tremendous amount of time simply reading everything I could get my hands on and trying it out on my own.

After several years, I switched from my previous career path and went into programming professionally. After four years of work, I ended up working at a major software company in their R & D facility. My coworkers thought I had an M.S. in computer science, even though I'd never presented myself as having one.

My conclusion is that knowledge is knowledge. You can get it on your own or by attending school. What's important is that you have it, and have the drive to keep learning regardless of whether you're in school or not.

"knowledge is knowledge"... I liked that!
Kensai
+14  A: 

I'm a fellow EE, but I dabble quite a bit in computer science, so I can speak to topics covered in a computer science degree that are not covered in an EE degree.

Discrete mathematics

Mathematics for programming is quite different from mathematics for engineering. The only obvious overlap is discrete probability. Other topics, like analysis of algorithms and Big O notation, aren't usually covered in engineering mathematics courses.

Data structures and algorithms

Engineering programming courses usually cover simple algorithmic concepts like recursion and divide-and-conquer (quicksort and the FFT) and simple data structures like linked lists and trees. A computer science course on data structures and algorithms will cover additional algorithmic concepts like dynamic programming and additional data structures like graphs.

Theory of computation

I know topics like automata theory and completeness (P, NP, etc.) definitely weren't covered in my EE degree.

las3rjock
Your answer covers the right stuff comming from an EE background!
Tim
Yeah, i'd add to this, the advanced algorithms courses too. It really lets you look at efficiency...
Irwin
+1  A: 

I have degrees in EE and Comp Sci from a long time ago :) There are definitely good things that you are forced to learn in a computer degree program, but it's not everything. There are concrete things that you don't learn (various java packages, using Studio to debug, source control systems, patterns used in specific frameworks). But there are things you do learn that are good foundational knowledge, even though you may not realize it at the time (algorithms, etc. as people have posted).

I also co-oped (required in U.Cincinnati's Engineering college) which was a great experience. That caused me to realize that there are practical uses to some of the seemingly abstract things you learn in class, so I was more motivated in school than I might have otherwise been.

While I consider a degree as usually indicating a certain level of foundational background skill, as well as diligent effort, I look for more when interviewing. And I've known a few great developers that didn't have degrees, so it's not always needed. Also, colleges don't usually cover stuff like the social aspects of engineering, or working on very large systems, and such that can be very key in many job situations.

Having been away for a long time, I realize that it's easy to forget the stuff I did learn in school or on the job. Our industry keeps changing, so I think reading in the field is important. And I think reading more broadly than just technically-detailed stuff is important. That's why I like joelonsoftware. I recently came across his site and the books he's edited/written while looking for ways to learn more about software development.

So I would recommend everyone, degreed or not, read books and articles about software development. One of my grad classes in software engineering did have us read stuff like The Mythical Man Month, which is great. I also like books on software construction, such as McConnell's Code Complete. Joel has a good list of recommendations on his site:

http://www.joelonsoftware.com/navLinks/fog0000000262.html

Cincinnati Joe
+2  A: 

In my experience, 4 years of seeing pieces of code or algorithm pseudo-code helps develop an instinct for assessing technical elegance - you can tell good ideas from bad ideas faster. It's valuable to be able to discard a bad idea five minutes after coming up with it instead of after five months of trying to make it work.

quillbreaker