views:

4091

answers:

37

I am a self-taught programmer and I do do not have any degrees. I started pretty young and I've got about 7 years of actual programming work experience. I believe I'm a pretty good programmer, but I admit that I have not played much with algorithms or delved into any really low-level aspects of programming such as how compilers work.

I have worked with other programmers with and without degrees. Some were good and some not; having a degree didn't seem to make any difference as to which pot they fell into. Since then I've come to realize that it does depend on the school where the degree is obtained.

Some people suggest that you really should get a degree; that there are things you'll learn in the process that you won't learn in the real world. Of course there is personal growth and discipline learned from completing a task of that magnitude, but let's just concentrate on the technical knowledge.

What would I have been taught in a GOOD CS course that would aid me today and what can I read to fill the gap?

I've heard the book "Algorithms" mentioned and I plan on reading that. What other books would you recommend?

Edit: Clarification on 'actual work experience': Have worked for 2 small companies on teams with fewer than 5 people. About 2 years experience with Perl, Python, PHP, C, C++. About 5 years experience in Java, Applets, RMI, T-SQL, PL/SQL, VB6. 7 years experience in HTML, Javascript, bash, SQL. Most recently in Java designed and helped build an N-tier Java app with web frontend and RMI.

+2  A: 

The Spy Who Came In From The Cold by John Le Carre

Philippe Grondier
+31  A: 
  • Books on theory. Scheme, Lambda functions.
  • Books on Algorithm Complexity - O(N) O(n^2)
  • Books on NP-completeness - Knapsack Problem and Traveling Salesman
  • Books on Algorithms and Data Structures - AVL Trees, B-Trees, Red-Black, Graphs, Shortest Path
  • Books on C, eventually up to something like Deep C Secrets which I just finished, and loved
  • Books on Compilers, so you at least understand the different passes
Tom Ritter
like... some examples? good readings? come on topics are good but there LOTS of bad books in each one!
DFectuoso
I agree with some points, but overall this is IMO a little too academic.
Mr. Brownstone
Algorithms - ISBN 0262032937Compilers - ISBM 0321486811
Calyth
Deep C Secrets is one of the great books. I'm glad someone else enjoyed it.
Norman Ramsey
Deep C Secrets is an excellent book. I wish more programming books were like it.
Dana Robinson
Yeah, those are good recommendations for CS books, but they might not be very helpful out in the field.
Mike Hall
+4  A: 

I would say that Corman and Rivest's (CLR) algorithms book is a must have. You don't have to master everything, but it's a very good introduction to the CS thinking. It also covers topics like computation and complexity.

I would also suggest reading one of the main textbooks on computer architecture and assembly.

If you do a lot of network work, you may want to read an academic textbook about the underlying theory.

Finally, there are books on programming languages and type systems, but many of them are not very approachable.

Uri
If you could chose exactly one, CLR(S) should be it.
+1  A: 

I'll be honest, the degree is mostly proof to your employer that you can follow through on a task that takes an extended period of time and energy. Many employers, despite your prior skill, may not look at you without it in this field.

That being said, I recommend "Domain Driven Design" as a book to read. But do consider getting your degree. It will simplify all career-related transactions. =)

EdgarVerona
Also, many employers ignore degrees completely--the poster is right, they prove nothing about your programming ability, simply the ability to stay in school.
Bill K
+20  A: 

Gang of Four's Design Patterns: Elements of Reusable Object-Oriented Software - best pattern book of our time, BUT also quite hard\dry to read so if you are looking to understand the material in a much easier way I would also recommend Head First Design Patterns

cgreeno
I completely agree.
Jason Jackson
+2  A: 

Object Oriented Software Construction by Bertrand Meyer (1997)

Philippe Grondier
A blast from the past!
John Nolan
+2  A: 

Study probability and linear algebra, and as you do try and come up with solutions to problems using programming. Throw in some discrete mathematics and really force yourself to learn how to think in terms of proofs and expressing problems and solutions mathematically, it will help you organize your thoughts and make you a better programmer, especially if you ever run into any hard problems. Check out Open Courseware and, even if you don't want to take a course yourself, look at the materials they cover in the different courses and see what catches your interest and really dive into it. Just reading a book won't give you the kind of deeper knowledge of a subject that working on problems and forcing yourself to solve them instead of just flipping to the answer page will.

The core of being a good self-learner is to be able to push yourself even in the absence of marks and diplomas as external motivators.

alxp
+19  A: 

I'd recommend "Structure and Interpretation of Computer Programs" by Abelson and Sussman. You can also watch class videos from MIT.

See this wikipedia article: http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs

jdigital
+3  A: 

Sorry, i don't think undergrad CS courses teach anything useful. At least that is my experience.

Furthermore, "a pretty good programmer" doesn't mean anything.. native language programming vs. managed language programming is very different. UI calls for certain patterns that you should be experienced with, in a particular UI framework. Working with a DBMS requires understanding of concurency, transactions, etc.

Probably the best thing is to identify your interests. It's pretty hard (and costly) being a renaissance-man type programmer these days, who dabbles in everythign. That will come with time, but you first must know one area well.

Algorithms are useful, but they also come prepackaged these days in neat little classes. What doesn't come prepackaged is a thorough understanding of what happens to your code when it gets executed. For example, if you were interested in server side programming, I would suggest you start looking into Java or C# internals, performance considerations, best practices, etc.

How many undergrad CS degrees does your experience encompass? :-)
Alec
Considering how many I've hired and worked with over the years, probably 40+. Without fail, if I had to pick the best I've known, I'd list a BSEE, a failed premed, a BSCS, and a MSCS with an undergrad in Civil Engineering.The common denominator was passion. These were guys who over the years put in their own personal time to gain the experience to master their skill. School will whet you apetite, but no more.
+6  A: 

Joel posted a great list a while back : http://www.joelonsoftware.com/navLinks/fog0000000262.html

Kevin Davis
We are all Joel's fans ...
Philippe Grondier
+1  A: 

I think the The New Turing Omnibus would be great for start.

Mr. Brownstone
A: 

General Tales of Ordinary Madness by Charles Bukowski. My favorite by far

Philippe Grondier
I presume you were trying to be cute or coy. A recommendation to read something besides the "same old, same old" would have been much more appropriate.
Stever B
Neither cute nor coy ...
Philippe Grondier
Why should a programmer with no degrees read only software related books? Isn't he entitled to have a decent cultural life in addition to an exciting job, just to make sure that he doesn't end as a narrow-minded standard software developer like most of the downvoting guys here!
Philippe Grondier
+3  A: 

The C Programming Lanuage

The C Programming Lanuage was a great read for me as a non-CS major. Simple things you take for granted, like local variables in functions, are described in such detail. Complex things like pointers and memory management are described in a very readable way. This book really made low level programming seem a lot simpler than they way I had thought about it.

Nick
+10  A: 

Related SO Questions:

These might help you cull some imformation together

Simucal
+1  A: 

++ I just bought Design Patterns: Elements of Reusable Object-Oriented Software.

AviewAnew's comment might seem a bit exagerated, but it all depends in how deep you want to understand the whole thing.

The lower the better.

I have even played with microcontrollers, made lots of circuits (digital and analog with opamps and several electronic elements), then I played with asm (just a little) for several chips.

But.... I found that I was missing the "magic" of OO, so I bought some OO books.

So..... What can you improve? any weaknesses?

+33  A: 

Code Complete, by Steve McConnell The one single book that will teach you what you really need to know, and more importantly it will teach you how to think like a programmer, which is something one would hopefully get from college, but alas often is not taught.

Another great one is "Writing Solid Code" by Steve Maguire. Teaches you how to write code that will not fail mysteriously and that is easy to debug.

David Frenkel
as a self-taught, this has been in my library since it came out.
Tom Anderson
You should read it more than once. I've red it recently and I'll probably read part of it agian in the future.
Mathieu Pagé
+1  A: 

I strongly recommend Applying Domain-Driven Design and Patterns: With Examples in C# and .NET even if you aren't a .Net developer. It truly opened my eyes to TDD and Domain-Driven Design.

Basically, try to read books that focus on related topics but not exclusively about programming because programming in and of itself will come with practice (if you understand logic). Try to focus your learning on designs and patterns, testing, networking, and other miscellaneous functions or frameworks (linq/entity framework for instance).

Also, try to expand your knowledge-base of languages. Become comfortable with dynamic and functional languages, SQL, XML, and of course XHTML / CSS. The sheer versatility will significantly help you improve the overall quality of your workmanship.

On a side note, CS degrees generally prepare someone for the next-step in the education cycle. A lot of what you would have learned in an educational environment would prove trivial for a typical business-oriented developer. I have been in the business for awhile and I'm still finishing up my degree (last semester, thank god). Almost all of what I have learned has proven to be applicable has come from self-taught learning.

CS is one of those fields that a degree holds entirely too much weight. I barely squeeze by with a 2.x but run a successful firm and, although this may sound arrogant, can architect and program better than most graduate level students.

Chance
+10  A: 

Fowler's Refactoring: Improving the Design of Existing Code

ctacke
+3  A: 

I've been programming professionally for almost 10 years - and I will be graduating this year. The coursework I did was largely useless. Hands on experience and finding one or more great mentors will serve you far better in terms of becoming an excellent engineer.

The good thing about finishing a degree is that a) it is a nice resume bullet that HR types like to look at b) it teaches you some jargon that is useful for communicating ideas to other developers for example: Normalization is word that we throw around in the real world - there's a text book definition that's nice to have in the back of your head, but in practice it typically just means adjusting database tables so that your data meets your needs in terms of performance and scalability. c) helps you to learn to communicate better ... which is a useful skill that will set you apart from a lot of software people.

Things I recommend reading: 1) operating system design 2) data structures and algorithms 3) database theory and....if you are standed on a desert island with nothing but a laptop, unlimited power and a single coding book of your choosing... without a doubt choose:

"Elements of Reusable Object-Oriented Software" -- Gang of Four

+2  A: 

I recommend learning Lisp. As a programmer, being able to see a problem from more than one perspective is an important skill. Don't stop at Lisp, though. Keep going with other languages. Constantly ask for language recommendations.

Rishabh Mishra
A: 

Code Complete, Algorithms by Vazairani, Also by skiena

kal
A: 

Given your current level of programming experience, you will be wasting your time reading any purely academic books unless you are planning to pursue a degree. And if that is the case, I would only focus on the books required for each course.

I don't personally know a single programmer that has once referred to a purely academic book to help solve a real-world problem. Outside of gaining some practical experience with pointers and data structures in C and a general understanding of Big-O notation, my CS education has done very little to advance my career other than allowing me to truthfully promote the degree on my resume. Programming skills are practiced, not researched.

As far as the degree is concerned, I would recommend you pursue one as soon as possible for one reason - money. Unless the two companies you've worked for are philanthropic, I can all but guarantee that you are making less money than your co-workers who have degrees, even though you may be the more skilled programmer. Further, I would strongly suggest that you pursue a degree that has "Engineering" in its name instead of "Science." A Computer Engineering degree, from my experience, carries much more weight and is more flexible (with a heftier salary) than a Computer Science degree.

Matt Davis
I agree with that answer - at lest in most parts - and I would like to hear from others why they voted it down. Maybe I could also lern from their argumentation.
Brian Schimmel
Agreed. I have no way of knowing, of course, but when I wrote the answer, I wondered if directly addressing the money issue might rub some the wrong way.
Matt Davis
+2  A: 

I am a self-taught programmer(8+ yrs), too. Till now, I found The Pragmatic Programmer: From Journeyman to Master is a very helpful book for me. It will not teach you technical details, it will tell you what to do/learn to become or keep being a good programmer.

Vincent Wang
A: 

Don't limit yourself to just books when there is so much free/open source code to study and evaluate. Some of it is good, some of it is horrible, some of it is so darn cryptic that your eyes bleed trying to read it (i..e. grab the source to PHP itself).

I'm self taught .. I started in the earlier days of Linux/GNU development (about 1992) after learning a bit of C through working on hobby BBS systems. The benefit of peer review is priceless ... you not only get input from one or several instructors as you would in a CS course, you get input from some of the most brilliant programmers working today.

I now work mostly with Unix-like operating systems, typically with something surrounding virtualization. I think, now, for me a degree would be painful to sit through.. I have no plans of getting one unless I absolutely must .. but I don't see that time coming in the far or immediate future.

People that I work with who obtained a degree from a quality university still blow me away .. like you, I could not sit down and write a compiler .. but I have dabbled in writing my own simple interpreted languages.

As far as 'really good' programmers? Those are just programmers who love what they do and continue to learn/study far after graduating. Those are the people who I love to learn from. Then you have the type who graduate and think the world owes them a paycheck.

Tim Post
A: 

I too was a non-CS programmer and taught myself by reading books. Here is what I found most useful:

I second the nominations of The C Programming Language and Design Patterns. The first will help you understand the machine. The second will help you see the elegance possible with OO programs.

A book on operating systems. I recommend Operating System Concepts by Silberschatz but there are plenty of others. I found this helped me to understand why the compiler did what it did and why the APIs were structured the way they were.

A book on processors and how they work. I found Computer Organization and Design by Patterson & Hennessy to be a great one for this. If you understand how a processor works, you'll understand a lot about how to make programs performant.

Be careful with the algorithms books. Many are very mathematical in nature and will be hard to understand if you've been out of school a long time. Look around for one that is less rigorous.

Steve Rowe
A: 

As you are aware of the technologies (you mentioned that) so I recommend you to read the following topics as a critical topics

Theory of programming languages Compiler construction Code optimization Operating system concepts

And you can select some optional topics like

network programming image processing

Ahmed Said
A: 

In short:
I don't think that reading books can replace getting a degree, so for me, there is no point in suggesting specific books or topics. I would recommend getting a degree, and if you really want to become a better programmer by reading, then don't concentrate on just one topic, be versatile and read what you think fits your current problem or your current mood. Don't read a book when it's a pain to you, you won't learn anything. Reading books should be part of everyday life for any programmer, no matter if he has a degree or not, but it's just one part of the process.

Now the long reason: (since it doesn't fit the question, I would have liked to write that as a comment, but comments are limited to a certain length, so you get it as an answer)

I'm currently almost finished getting a degree, and reading books was a very unimportant part of my studies. There are some books I might recommend, but they are not specific to someone without degree, since most people who have a degree don't know the bookt eiter I didn't read them beacause they were recommended or needed for the curse, I read them because they sounded fun to me. It's the same books that are recommended all over stackoverflow.com, not just here. Most of the times, Books on Algorithm Complexity doesn't sound like a lot of fun, but if some day it does, then you know it's the right time to read them.

Before the degree, I was a bit like you: I knew something like 8 programming languages, had several years of experience (in fact, I started programming BASIC as a 6 year old kid), and considered myself pretty much advanced. Why not just enter the business? (so here's th difference, I had no real working experience then, you have it).

For some reason, I did start to study, and I learned so much that I wouldn't have learned else. For example, I thought I'd have understood what OOP and inheritance are for. Now I know, that I knew about 10% of what I should know about OOP, and I guess now I know 70% - and I assume this is much more than the average programmer knows. I know people who make a living by OOP programming for 10 years now and still are stuck at the 10% level.

Know I think I understand why programmers without degree are paid less - they might be as good or even better as those with a degree, but without further verification, it's reasonable to assume that they are not. Let me tell you that some years ago I really hated this opinion, now I share it. It's not because they were telling us all day long at the university (they never did), it's some kind of snootiness that came to me naturally.

Last note: At universtiy, it wasn't the books, and it wasn't the curses that tought me much. The main source of knowledge was working on projects, sometimes alone, sometimes in groups. Now you might say, you do this all day long at work, so work would be the perfect environment to learn. But commercial work has other dynamics and rules, generally less suited to learn.

Brian Schimmel
Programmers without degrees are paid less simply due to market forces, i.e., supply and demand. Said another way, the demand for a programmer with a degree is higher than the demand for a programmer without one, hence the higher salary. It's not a snootiness thing; it's a business thing.
Matt Davis
+3  A: 

Interesting selection of books here so far and many of them are particularly good. I was surprised to see that the following were missing, so I'm going to add them:

  • UNIX Network Programming. W. Richard Stevens.
  • TCP/IP Illustrated, volumes 1-3. W. Richard Stevens.
  • IETF [RFC1034], [RFC1035], [RFC2616]
  • Mastering Regular Expressions. Jeffrey Friedl.

I know that these seem a rather strange choice for general purpose programmers but over the years I've found that understanding TCP/IP, DNS, etc. has been one of the single most useful things that I have ever learned. If you are planning on doing any serious distributed network applications and actually supported a deployed product, then a good understanding of how those Internet protocol thingies work is invaluable.

Now for a few esoteric choices that I really enjoyed:

  • Linkers & Loaders. John Levine.
  • Advanced Programming in the UNIX Environment. W. Richard Stevens, Stephen Rago.
  • Large Scale C++ Software Design. John Lakos.
  • Compilers: Principles, Techniques, and Tools. Aho, Sethi, Ullman.
  • Open Sources: Voices from the Open Source Revolution.
  • Programming Language Pragmatics. Michael Scott.

Beyond specific books, I would concentrate on learning solid software engineering practices and then learn how an operating system does what it does. The other thing that I thing helped me the most was really becoming proficient with tools and utilities. Spend some time really learning regular expressions, pick a good editor and learn how to use every feature that it offers, learn how to use GNU Make and Ant at a minimum.

And by learning how an OS works, I mean really digging into it - check out things like the "Design and Implementation of the 4.4 BSD OS" by McKusick and "Windows Internals" by Russinovich. Combine this sort of knowledge with compiler construction and linkers/loaders and you really get a good perspective on why certain programs behave the way that they do not to mention a lot of extra tools when it comes to debugging.

D.Shawley
Agreed. Understanding TCP/IP has been extremely valuable to me. I obtained this knowledge from doing an MCSE (yech) and also reading the NET-3 HOWTO.
sjbotha
A: 

http://www.amazon.com/How-Solve-Aspect-Mathematical-Method/dp/0691023565

A college undergraduate computer education can probably be caught up to by reading books and on the job training. Also a lot of it does not apply to a typical programming job because the college emphasizes theory and concepts. E.g. a class on unix will be on the design of the unix operating system, not how to write shell scripts. Most of the concepts related to your job you have probably picked up already.

However the general education from college does teach you things. All the math teaches you to be detail oriented and increases your problem solving skills. The papers will teach you to read stuff and not trust it without analyzing it on your own. Many people have these skills naturally and don't need college. Some people will never pick them up no matter how many years they go to college. Others learn them during college. I would say How to Solve It is good for solving math problems, but the advice also applies to other problems.

If you know C and C++ you probably know the difference between a linked list implementation of things and an array implementation and the complexity. If not, look into some algorithm books (Introduction to Algorithms Second Edition is probably one of the most popular but it is a tough read, there are many other easier ones...look at the reviews to find a good one). Even for a normal business job it doesn't hurt to know which containers are slower to insert/delete and which are slower to search, etc. and the relative differences in costs. Often changing one or two library calls or one class for holding things can speed up the code tremendously.

Cervo
A: 

Honestly it sounds like you've already got the head for thinking thru a problem. There are tricks to be gleaned from books, so to answer your question, I learned a lot from http://www.powells.com/biblio/62-9781558607019-0'>MJD's HOP. Though, I've found that I learn a lot more from interaction and practice. If there is a local user group start going to there meetings, you can publish something to CPAN. Long story short, get involved, it will help you figure out what you really want to focus on learning.

notbenh
+1  A: 

You'll be missing the algorithms background. I'd recommend you read Knuth.

Steve Lacey
A: 

I think Code Complete and alike are a bit too high level. What one needs is a good mathematical and algorithmical base, so...

a) Calculus and linear algebra stuff (if you haven't taken classes on that in HS).

b) Knuth, at least some of it.

c) Cormen: Introduction to Algorithms.

d) Structure and Interpretation of Computer Programs

Of course, anyone can go out there and code in Java or even C: it's not as complex as many would like it to be, I bet my grandmother can pick up pointers easily. What they might not be able to do though, is create an algorithm that doesn't suck or think through a complex system and that's why you need to expand your mind by yourself or with a good CS program.

mannicken
+3  A: 

I guess that posting yet another answer, especially one that shows up below the fold might be futile ... but I'd suggest that your next move should be in two directions:

Firstly, get really really good at one area - specialise in it to an extent, get to know it forwards, backwards and inside out.

Secondly, get wider experience/knowledge across a very broad range of skills - you need to know a little bit about a lot of things.

The Challenge - doing both at once!

For that second bit, here's a partial list of useful skills that I blogged in October:

  • Abstraction vs Implementation

  • Amortisation

  • API Design – noun/verb vs Fluent

  • Authentication vs Authorisation

  • Bandwidth vs Latency

  • Caching: Expiry strategies and memory use

  • Class Oriented vs Object Oriented

  • Class, Instance and Sequence diagrams

  • Colour Modelling

  • Compiled vs Interpreted code – byte-code, p-code, IL

  • Complexity: O(x) notation, linear vs quadratic vs exponential vs factorial complexity

  • Connectionless vs Connected

  • Database management: Schema design, query optimisation and indexing

  • Declarative vs Imperative programming

  • Dependency injection

  • Duck Typing vs Strict Typing - Type Inference

  • Encapsulation

  • Encryption vs Obfuscation

  • Entity Relationship modelling

  • Entropy, Compression, Encoding and Encryption

  • Ethernet, TCP/IP and UDP/IP

  • Events - Singlecast vs Multicast

  • Exceptions vs Error Codes

  • Explaining technical issues to non technical people

  • Functional vs Procedural programming

  • Hash tables and arrays

  • Identity

  • Indirection

  • Inheritance vs Composition

  • Instantiation

  • Liskov Substitution Principle

  • Lists/Stacks/Queues and Trees

  • Memory heaps and fragmentation

  • Memory management Garbage collection vs malloc/free vs reference counting, stack frames and pointers

  • Method Missing

  • Mutability vs Immutability

  • Mutual Exclusion and Locks

  • Object vs Component Orientation

  • Pattern Matching and Regular Expressions

  • Polymorphism, Abstraction and Interfaces

  • Pre-emptive vs Cooperative multitasking

  • Proxies and Delegation

  • Recursion vs Iteration

  • Requirements vs Specifications vs Implementation

  • Semaphores, Spin Locks and Monitors

  • Single Responsibility Principle

  • Source code management - labels, branches and versioning

  • State machines - deterministic vs non-deterministic

  • Stateless vs Stateful

  • Teach a class and Present a seminar

  • Technical documentation

  • Testing Unit vs Integration vs System vs Performance vs User Acceptance

  • Threads vs Fibres vs Processes

  • Transactions Commit/Rollback vs Complete/Abort

  • Unicode vs ASCII, UTF-8 vs UTF-16

  • Write Training materials

Bevan
A: 

Some intro book on algorithms (with mathematical analyisis concepts).

Demian Garcia
A: 

Science Fiction. :)

And that's not a slam. I don't have a degree either. I just like Science Fiction.

John Lockwood
+1  A: 

Not a book, but Stanford has an awesome set of videos on Youtube.

My personal favorite is CS107 - Programming Paradigms.

Jurily