Fog Creek Software
Discussion Board

Beginning Programmer - What Should I Learn?

I'm a rising college senior, and I was hoping to get some opinions on where I should concentrate my learning, in terms of programming.  I want to balance two concerns:

1. Maximize my programming ability
2. Maximize my professional desirability

I'm very proficient for a college student, which means that i can run circles around my classmates while still (I assume) being vastly inferior to a good professional programmer.  I know Java and C++ well, but I've have no experience whatsoever in GUI programming.  I was thinking about picking up Visual Basic, something I have no experience with.  Let's hear some opinions on whether that's a good place to start.  If so, would you go VB or VB.NET?  What other books would you recommend picking up?  Right now, I'd like to concentrate on learning concrete skills (i.e. VB) as opposed to general programming/workplace/productivity stuff (Peopleware). 

Where should I concentrate my energy?
What books should I pick up?

Bring on the comments

Mike Harris
Sunday, July 20, 2003

"I'm very proficient for a college student, which means that i can run circles around my classmates while still (I assume) being vastly inferior to a good professional programmer."

This statement is BS.  See all the threads about "best programmer" on this board.  If you think you're going to get into the industry and learn some "magic trick", you're not.  There are no magic tricks.  This seems to be a misconception among college students.  They think to themselves, "What do the pros know that I don't."  The answer is, "Nothing.".

Programming is simple.  Easy one might say.  There is no magic to programming. 

Unless you plan on working for a game/software company then I would brush up on business aspects such as accounting, the ecomony, process control etc etc, so that you know something about the manufacturing and service sectors.

Sunday, July 20, 2003

Maximizing your professional desirability requires you to decide where you want to go. If you want to work in financial services, learning the ins and outs of J2EE is probably a good idea. Some business sectors find .NET desirable.

If you plan to take on the gaming industry, image generation, physics, DirectX and OpenGL will probably be a good way to go.

Maximizing your programming ability is a totally different game. I'd propose picking a subject you're interested in, and then learning it from many angles. For example ....

If you pick compilation, study parser generators (lex, yacc, D, ...) and how they work. Study "manual" techniques like recursive descent, tree rewriting. Study representation formats - 3AC, 4AC, SSA, Stack machines, Register machines. Study implementations, like lcc, tcc, gcc. Look at concepts like specialized compiling. Be able to write a reasonable compiler without any helper tool. And then move on ....

Then pick another subject, lather, rinse, repeat.

It's important to know how to solve a problem in many ways. If you consider "a language to program in" a problem then C# and Java are not at all different ways; C++ vs. Java/C# are slightly different ways. Lisp, C, K/J/APL, Haskell, Prolog, Assembly, Joy are _very_ different ways.

Learn how to think critically and how to evaluate others' claims. Most App server vendors make claims about scalability and reliability that are outright false, yet 95% of their customers can't tell that's the case.  Don't be part of that 95% [Note: This does NOT make you more professionally desirable in today's world. You have been warned]

Ori Berger
Sunday, July 20, 2003

[Programming is simple.  Easy one might say.  There is no magic to programming.]

That's like saying writing is simple, there's no magic to it. You could say there's no magic to anything, if you want.

The Real PC
Sunday, July 20, 2003

The only advice I'd give to any beginning programmer is this: learn a language that makes a distinction between pass by reference and pass by value. I am not necessarily saying C/C++ (though that's what it was for me).

I suggest this because I see a lot of students who's major deficiency is a lack of understanding of what is really being passed around. I don't think it's a difficult concept, but I think Java hides it (not that java isn't valuable, but I believe it is not a good starting language).

Other than that, try things. Don't do something to become 'marketable'. You won't enjoy it. I wrote a CD catalogger so I had a CD catalogger, but in the process I learned SQL and some basic data modeling techniques. I didn't do it to learn SQL. Enjoy yourself.

Get a girlfriend ;) I could do with knowing one fewer language and spending the time instead on other things 8-}

Mike Swieton
Sunday, July 20, 2003

read up on time management techniques. You will be surprised how much time people waste while they supposedly work, and that you can automate alot of what people do. Also, get into an industry that you enjoy where you are not a programmer but someone who can program.

Tom Vu
Sunday, July 20, 2003

> They think to themselves, "What do the pros know that I don't."  The answer is, "Nothing.". <

I disagree with this. A professional often knows a LOT more than a movitated student, even if that "lot" isn't technical knowledge, but an understanding of how to deal with people, or the knowledge that they know "enough" to do their job, but can always learn something new.

A student or beginner is often still exploring new territory, while a pro will have well worn paths they use and can more quickly assimilate new concepts, and add them to their repitoire.

And often there are a lot of subtleties that someone with some experience gets that a student won't get. This is true in any job. None of the things I'm saying are specific to programmers.

If you can pick up new languages, new syntaxes, then probably your human skills are what you should be working on. Handling poor bosses & coworkers, giving presentations, proper phone manners, good dress & grooming habits.

Oh yeah, and get a girlfriend. =b~ The kind that will force you to take saturdays off, and make you glad you did. And don't neglect your existing friends when you get her. It's important that as you enter the work world, you have some consistency in your life so that the end of a job isn't the end of the world.
Sunday, July 20, 2003

There's a misunderstanding of what I'm trying to say. 

I'm talking only about writing code. 

I'm not talking about dealing with people or analyzing a problem etc etc.  I'm not talking about efficiency. 

See what I'm saying?  You'll probably only understand me if you've been in school and have been wondering what the magic behind programming is.  You sat in class and wondered why the guy in the front of the room is explaining 'if' statements when you've been writing 'if' statements for years without even thinking about it.  You're about ready to fall asleep but you stay awake just in case you miss the 'magic'.  Then you find out that there is no magic behind those 'if' statements and the prof writes them the same way you do.

Sunday, July 20, 2003

The only way to get better at programming is to write programs. Do a side project or two to teach yourself stuff.

Some ideas:

* Download Tomcat & MySQL and write a simple database-backed dynamic website in Java (eg a clone of this forum). If you've not got much Unix experience, then install Linux & do all the development in that.

* Write a clone of Frogger using C++, DirectX & Win32.

* Take something you've done already & rewrite it in Python.

Andrew Reid
Sunday, July 20, 2003

> * Write a clone of Frogger using C++, DirectX & Win32.

Not a bad idea, but this leads back to my original questions ..... where would you start to learn how to do this (I'm referring to the graphical and win32 portions)

Mike Harris
Monday, July 21, 2003

uh.. the internet?  There is definitely enough free Win32 and OpenGL/DirectX code out there to get by on... a very useful skill is to be able to pick up a new technology on your own, without anyone showing you how.  Download some code, read some websites, and books if really necessary.

Monday, July 21, 2003

In addition to Frogger, may I also recommend Lunar Lander - then you're forced to learn how to perform some nontrivial equations as well as maintain state...


Monday, July 21, 2003

"Not a bad idea, but this leads back to my original questions ..... where would you start to learn how to do this (I'm referring to the graphical and win32 portions)"

Okay, here's the #1 thing you can learn as a beginning programmer that will put you head and shoulders above your peers:

Start with a pencil and paper.

Plan it out. Figure out what you have to learn. Break it down into small chunks.

Then, learn how to do each chunk.


Monday, July 21, 2003

The DirectX SDK has lots of sample code. There are also books you could get* . http://www.gamasutra.comwould be a good place to start looking for resources.

Another idea:

* Network chess with chat window (in the language of your choice).

* Remember Reid's Laws of Computer Books:

1) In general, the thinner the book the better it is
    1a) The thickest book on a topic is almost always the worst.
2) Avoid books with the words "Unleashed", "Days" or "Dummies" in the title.
3) To write for WROX, you must have unusual facial hair.
4) There may be exceptions to the above. I am _not_ interested in hearing about them.

Andrew Reid
Monday, July 21, 2003

...and that link should have been

Andrew Reid
Monday, July 21, 2003

There's a considerable difference between learning a new language and improving your programming ability.

As for the former, Visual Basic is my first language, and I rather like it.  It's easy enough to learn, and lends itself well to reading (mostly because it uses words where the curly-brace languages tend to use a lot of punctuation).  VB vs. VB.NET is a toss-up -- there's plenty of VB6 still out there in the business world, and I think it's easier to slap together a simple GUI app in VB6 than in VB.NET -- mostly because the .NET libraries are so freakin' huge (translation: lots of storage space in your head).

As to improving programming ability, I'll second Andrew Reid's first post above (write programs).  The key difference between a new programmer and an experienced programmer is that, while they both know the syntax of a language well enough to write a function, only experience will help you really *know* how to organize a medium-to-large project in such a way that you can come back to it after a few months and make changes without pulling your hair out.  (=  Plus, as a bonus, if you put together an app for yourself, you can demo it in an interview -- and trust me, this makes a difference.

Sam Livingston-Gray
Monday, July 21, 2003

Yeah, I think the magic happens in having a finished product. Or maybe for you it will happen in learning assembly language. What, specifically, do you think you're missing from your vocabulary? If you were to sum up what you know about programming in a small paragraph, what would it be?

I've been known to ask this type of question myself... "I know what I know, but I don't know what I don't know." Does that about sum up what you're saying?
Monday, July 21, 2003

To the original poster:

Probably the biggest thing you don't know yet about being a professional programmer is the necessity to modify other people's code.  Until now you've been writing code mostly or completely by yourself, and if you did any group projects the other programmers were working on it simultaneously with you and you could ask each other questions.

In real world professional programming, you will often be called upon to modify code that was written years ago, with no useful documentation available, and the original programmer has left the company.  In addition, you should know how to write code so that the next guy coming along who has to modify it will have an easy time (that next guy could be you two years later).

In college, C++ was my favorite language, and I would use it almost every time for assignments that provided a choice for the programming language.  Professors would often state that I wrote surprisingly elegant C++ code.  I didn't think anything was particularly good with my code, because I hadn't yet seen how badly others could write in C++.  But once I started working, on seeing C++ written by others I got really turned off from it.

Things like the abuse of operator overloading, multiple inheritance, and implicit copy constructors made it a nightmare to understand what the hell the code was doing.  C++ is a real magnifier of the person's skill, good or bad; good programmers will use the power of the language to write programs that require 1/3 as many lines of code and run 10 times faster; bad programmers will use it to create the most unreadable crap that will crash whenever any other part of the system is modified.  Unfortunately, in this field most of the practitioners are marginally competent or just plain BAD.

Strangely enough, maintenance programming is what is commonly given to the least experienced programmers because it isn't as "sexy" as writing new programs.

To help build that skill, you can start by downloading an existing open source project, joining the project to add something to the requested feature list, or modifying it for your own purposes.

T. Norman
Monday, July 21, 2003

I want to answer differently, because I am able to break down a problem and find new solutions, but I've still felt there were big holes in my technique because I didn't study CS or EE formally.  You can get very far just by being thoughtful, but it's drudgery after a point.

I looked at MIT's CS syllabus and greatly benefitted from _Computation Structures_ and SICP.  However, I didn't like MIT's huge algorithms tome and instead prefer _The Design and Analysis of Computer Algorithms_ by Aho et al, a slimmer and smarter volume.

Fun and elegance of CS can be found in _The New Turing Omnibus_.  I haven't found anything like it elsewhere.  For DBs, a boring subject, Date's _An Introduction to Database Systems_ is by far the best I've found; but keep in mind the bastard is incredibly long-winded; I hear earlier editions were less so. 

I just bought _Programming Language Pragmatics_.  I wish I had this book before; it seems to talk intelligently about a gazillion languages as well as concisely about compilation and interpretation.  Also _Handbook of Programming Languages_ edited by Salus is very underrated.

That's about it for basics... you may want to browse these links.

Monday, July 21, 2003

anon, that's a strange thing to say - that there's nothing to learn.

There is absolutely HEAPS to learn on the path to being a useful developer, and I am certainly not talking about "accounting" or other irrelevancies.

I often wonder -  guys who says there's nothing to programming - are they the guys that build Access databases or Lingo apps or something?

Monday, July 21, 2003

"2) Avoid books with the words "Unleashed", "Days" or "Dummies" in the title."

except "C unleashed" (if memorized correctly) - quite an impressive book.

There are basics, which will serve - or bite - you in any language, where you learn them isn't relevant as long as the language doesn't hide them: value vs. address, control flow, memory (layout), system calls, ipc ... - learn them.

Lurk around, where the professional are, especially ng's: comp.lang.your.choice (c, c++, cobol, pl1, rexx ...).

Do projects of your own, f.e. write a database engine,
make a SQL-interface bit by bit.

Try, to enjoy it.

Monday, July 21, 2003

If you do not know Excel, I would suggest learning it fairly well.  Everyone in business uses it, and your university training may not have exposed you to it yet.

Good luck.

Ran Whittle
Monday, July 21, 2003

Great advice Wolfgang. Oh and read this:
Monday, July 21, 2003

I *highly* recommend that all students read Steve McConnell's "Code Complete: A Practical Handbook of Software Construction". Ignore the fact that the book is published by Microsoft Press. Ignore the fact that the book is 10 years old. As a student, this book taught me more about "professional programming" than any of the college classes. Sad, but fortunately it was not too late for me! :-)


Monday, July 21, 2003

A few thoughts:

> while still (I assume) being vastly inferior to a good
> professional programmer.

Good for you for recognizing this. 

I occasionally ask interview candidates "on a scale from one to ten, how good a programmer are you?"  Bad candidates say "Nine!"  Good candidates ask "Who is a ten and who is a one?" before answering -- they also give much more realistic answers!  "By ten I mean your best classmate" and "by ten I mean Stroustrup" are rather different!

(Politically astute candidates will ask "where are YOU on that scale?" -- I mean, I wouldn't rate myself a "nine" C++ programmer and I design compilers for a living... :-) )

Be like Socrates -- know something about what you don't know.  When I started my first programming job after graduation (seven years ago) I knew a fair amount about the theory and practice of PROGRAMMING but nothing about SHIPPING SOFTWARE.  Programming skills are certainly necessary, but to ship software you'll need to learn how to:

* write secure code
* debug other people's code
* design features based on user requirements
* deal with customer feedback
* turn around high-quality patches quickly
* balance innovation with backwards compatibility
* work in groups -- which often means negotiating schedules!
* manage versioning issues
* test code for correctness, robustness, performance, scalability...
* etc, etc, etc.

Note that some of those are highly technical and some are very non-technical. 

What makes you attractive to employers is not being a hot-shot programmer, it's being someone who can program AND can _learn_ how to do all those other things. Those things aren't taught in college and aren't spelled out in the job description either.

> Let's hear some opinions on whether that's a good place to start.  If so, would you go VB or VB.NET?

First off, VB.NET all the way!  Managed code is the future.  VB6 is hopelessly 20th century. 

But more generally -- do not worry about compiling a laundry list of languages.  VB.NET is basically C# with a funny syntax.  If you understand object-oriented, procedural and functional programming then it doesn't really matter what languages you know.  You can pick up new languages easily if you know the underlying concepts cold.  Learn the FRAMEWORK, not the LANGUAGE.

> What other books would you recommend picking up? 

Code Complete is good, as is The Pragmatic Programmer.  Writing Solid Code concentrates on C, but I use its lessons every day writing C#.  Don Box's book on the .NET Framework is very good if you're trying to get up to speed on managed programming.

Good luck!


Eric Lippert
Monday, July 21, 2003

Have you read all the books recommended by Joel?

Warning: You may not find a job even if you read all those books.

Also, learn Object Oriented Programming and Relational Database and how to combine the two.

Rick Tang
Monday, July 21, 2003

*  Recent Topics

*  Fog Creek Home