As someone that will be applying for jobs in the near (immediate) future, I'd like to get some perspective on the differences between academia and the software industry. As I've never taken an internship all I've known are school and personal projects.

What is the biggest difference between college and the "real" world? What surprised you the most when you got out? Is there anything you wish you'd have known?

+91  A: 

The proportion of existing code to new code that you'll be dealing with.

People come out of college expecting to write a lot of stuff from scratch and having the skills to do just that.

Unfortunately, they'll spend a significant amount of their time learning and integrating into existing codebases. An endless source of trouble they are ill prepared for...

I couldn't have put this better. A lot of programmers finish school wanting to write a lot. The hardest thing I had to learn was using someone else's code, even if I felt I could do it better. In some cases much much better. It's a big challenge to overcome (in my opinion).
Dan Herbert
I'll never forget my first day at [a major CPU maker] when I was 19: Here's software we got from the states. All our hardware testing for the upcoming processor is going to depend on it. Get it to work with our project...
I think exposure to open source helps mitigate this shock. You get used to reading code.
Chris Dolan
There is a lot of crap out there that you will have to shut up and support. Could you write it better? Maybe. But instead of spending the time to do that you have other things to do which align with corporate priorities. In college there is no business case because you write all your own code.
+51  A: 

That most businesses aren't run with logic, or that the people who run them don't really know what's going on. It sounds disheartening, but it took me a while to get used to the number of bad mistakes that people make that could easily be fixed by thinking a little more about the day to day operations of things.

I can't verify that about 'most' businesses, since I've only worked a few businesses, but there can be a disparity between what development would do, what designers would do, what management would do, and what the client would have you do.
There are also unrealistic expectations that people may have. They may give you a task that is impossible to do. In college most projects are doable, in fact they have been done semester after semester...In the business world there are no you have to watch closely and communicate.
+4  A: 

Timeframes. In the real world timeframes are very important. Remember that you will not have the amount of time that you would like to do things like employ best practices and implement feature sets that you know will benefit the client. Choosing premade solutions is a necessary evil; and an important lesson to lean. Also learn how to gauge the amount of time you need to complete a project or a certain feature.

+1  A: 

The ability to start something from ... apply the latest and the greatest, then STILL muck it up by generating a nondocumented, 400 PHP files buggy monster which by no means can be managed by one person alone.

That or the coding standards disparity. I guess since in college everyone is going by what is taught, then there's not much divergence. Out there, you'll find a coder which uses all caps variables then the next which underscores everything... one which makes an all-in-one page or one which makes a PHP document for the most banal of functions.

+3  A: 

At risk of stating the obvious: in the "real world" you generally get paid for the work you do. (Sorry, I've just been reading Piled Higher and Deeper.)

In school, 80% gets you a 'B'. In the real world, 80% gets you fired.

Barry Brown
On the other hand, in the real world, you get the chance to fix your mistakes to make that 80% better. There's no such chance at school, it's all or nothing.
Matthew Scharley
Funny, I thought 80% was an A, or at least an A-? :)
My school has 90-100=A, 80-90=B, 70-80=C, etc. Of course that's the numeric grade without the "curve", and not a good indicator of overall effort.
Kyle Cronin
School is mostly about knowledge, sometimes even simply memorizing things. Working on a job is foremost applying knowledge, making decisions, setting priorities. I seriously doubt you can compare school with work.
+30  A: 

I would say the actual percentage of my time spent writing code is lower than I would have expected. It's different everywhere I suppose, but I spend a lot of time gathering and disambiguating requirements, running design ideas past fellow developers, and just dealing with overhead in general. When I get to actually sit down and code, it's a treat.

Don't forget debugging, creating installations and testing.
How could I? Good addition.
and writing documentation...
+14  A: 

The most important skill for a beginner is ability to debug/understand someone else's code.

I have a coworker who by his own admission isn't good at writing lots of new code, but he's a master at debugging, so he's very respected in the team.
Joeri Sebrechts
And not only is it the most important skill, it's one you probably weren't taught at all! :-(
+86  A: 

Just how horrible most programmers really are.

Oh, yes. True words!
Jason Etheridge
Just how boorish people are who think they're better than others. Give me a break!
And the truth is that you yourself will be horrible. Not because you are bad. But often corporate priorities necessitate horribleness to get something done. Companies tend to care jack about elegant design and just want it done yesterday....
I spent time code generating something and had to argue with my boss because it took me about 2 hours. He was wondering why I couldn't cut and paste. It would have taken me 30 mins or so. But after a change it would take similarly long. Fortunately we had enough changes so it paid off...
Some shops are better and emphasize good design, abstraction, UML, great architecture....And it comes from the top. There are many more that just want results now. Also QA helps code quality too. That is often one of the first things to go bye bye in tight deadlines....
I had this response in my textbox but didn't submit as I didn't want to be aggressive. You are a bolder man than I am.
Most programmers can't program:
Joeri Sebrechts
+2  A: 

I did an overview of a company one day. I walked in, got to sit in and watch how things worked and the like. I was completely astonished at the amount of meetings that the staff was forced to attend. Some were legitimate "hit the panic button, the build just broke" meetings...but it still surprised me.

Zee JollyRoger
Huh, you think broken builds need meetings? The last thing you want to do when the build breaks is panic, a meeting or the worst kind: a panic meeting.
+28  A: 

How important estimation is. Knowing how long something will take to develop+test+integrate is really important to the business.

Jonathan Rauch
And that's one of the hardest things to do as a software developer, IMO!
Important and impossible.
The problem is they don't want to accept the answer hmm let me take some time to figure this out. They take an estimate, then revise the requirements and hold you to that estimate.....Even though you estimated a totally different project.
Or they cut your estimates by a third, because "something that simple can't take that long". Or they take your estimate of 6 weeks, and tell the customer "it'll be done in 6 weeks", forgetting that you have other tasks that can't wait. And so on...
Joeri Sebrechts
@steveth45: NOT impossible, just politically difficult some places. Read "Software Engineering Economics" by Barry Boehm and "Controlling Software Projects" by Tom DeMarco.
John R. Strohm
+32  A: 

That people considers ugly, unmaintable, unoptimized, plain-stupid code OK as long as it runs and produces the desired results.

Julien Grenier
Ugly, unoptimized, and stupid don't matter if it produces the desired result. Unmaintainable, really means difficult to maintain, which means you have a job.
Aye, wisdom there.
And the funny thing is that most of the time it is good enough. As far as optimization. Often code starts great and then as it is used for purposes not intended it gets a ton of patches that turn it ugly. This "ugly" seems to be called "The Real World" :)
A working code is worth a thousand non-working ideas.
Vardhan Varma
If you wish to create beautiful things, go paint. I don't believe in the "beauty of code". Just the one that can be written in a reasonable time and it works, and the one that can't and doesn't.
+1  A: 

The fact that most programs don't actually do anything. The vast majority of your work will be "Input data from the keyboard, write it to the database; Read data from the database, write it to the screen".

One might expect that there would be some processing or manipulation along the way, but actually there's very little of that.

James Curran
Isn't that pretty much what a computer program is supposed to do? It makes information more accessible and malleable than it is on paper in filing cabinets. I would beg to differ that converting information into a centralized, useful form is not doing anything...
+6  A: 

That oftentimes, you'll have to throw programming practices, good code, skip planning, in order to meet some other requirements.

And after that realizing, it's your responsibility to balance it all.

+6  A: 

That years of experience, qualifications and job title are less of an indicator of how good a developer is when compared to real passion for the job and an open mind to alternative views.

So @nobody, being a trusted user of Stack Overflow before you have even graduated can only be good for your career ;)

That should have been "trusted". Repuation accroding to Jeff is just a measure of how much StackOverflow trusts you. Passion and alternative views are central being a regular on StackOverflow I think.
+12  A: 

As programmers, we sometimes fail to see the bigger picture - the one that goes beyond the project or product we are working on. Sometimes, you have to do things that seemingly make no sense, but do make sense when a business is viewed as a whole.

Good programmers see it as an art, but business and art are two different things.

This is probably the biggest realization for me. While I would love to *always* write perfect code, there is much more to it than that, especially when business must be considered.
+2  A: 

I remember quite clearly (from 1993!) that what surprised me the most was that all these professional-looking people were taking the creation of software seriously. While I was at Uni, it all seemed like play; now, in the real world, the code I'd write would be part of something that people were paying money for.

Jason Etheridge
+9  A: 

One thing I've found disheartening is the seeming failure of object-orientation as a paradigm, yet the outstanding success of object-oriented languages. I get stomach pains every time I'm forced to write procedural Java at work.

+38  A: 

How often non-programmer managers make decisions about languages, platforms, or anything else that they know little about.

This one's a killer. I wish I could give it more votes.
You mean I can't have my website implemented in Swing, MySQL, Ruby on Rails, AJAX, SQL Server 2008, ASP.NET with F#? What they are mutually exclusive...
If I read things like that, I'm so glad that all my bosses are programmers. That's one of the good things in smaller companies.
+17  A: 

Well, several things did surprise me:

    - the fact that you will write code in more languages that you know when you graduate
    - the fact that you will read a lot of other people's code, either to see if it can reused or to fix bugs for it
    - the fact that CVS/SVN/RCS/GIT are not just words, are tools you'll love to use (although you never used them in college)
    - the fact that the client has no idea what it wants
    - the fact that despite the above, the client will demand a specific technology to be incorporated in the project
    - the fact that despite all of the above, I still like programming
Sweet technolofy!
+12  A: 

Having to sacrifice quality, features, good coding standards and general perfectionism to get things done in time.

People tend to underestimate, not overestimate. If you overestimate, you pay a very small price up-front. Underestimate, and it's crap creek sans paddle.
"we will be done on time! We will cut anything to do it!"
+11  A: 

The fact that the amount of time and effort spent in testing is sometimes greater than coding.

And also that testing increases the value of ugly code.

You'll also be amazed at the amount of friction you may have to endure to fix a bug by just deleting one line of code. There may be a 48 hour overhead to do a 1 minute bug fix...

Ates Goral
+4  A: 

The fact that, when building business applications, you will rarely use all the information learnt on college (such as compilers/algorithms/data structures) as most of the basic computing problems have aldready been solved for you (in the format of libraries and / or frameworks).

However it does give an edge when you have to solve a problem and you optimize the solution by using one of the models taught (using a red an black tree to order some data in session, for instance).

+10  A: 

Four points

  1. Most of your university classes will probably not apply directly to on the job. There are exceptions (computer gaming, scientific simulations, etc.). But for a typical hook up the ASP.NET web app to a database you will not be using much more than basic programming and algebra. In data structures you will use lists and maybe hash tables. Again there are exceptions. Google and Microsoft do a lot of cutting edge stuff as well. But to be in a position to apply all that knowledge right out of school may not be realistic. One exception is database class. There is a lot of stuff on normalization that may come in handy later in your career. If you covered the implementation of a database system that stuff is not so important. How to write queries and SQL will probably be something you use quite frequently.

  2. There is a really good chance you will not be working for a software company. Financial Companies, Market Research Companies, Retail Companies, Manufacturers, drug companies, etc. all have software and they all need developers. Also right now the economy is getting bad. And typically when the economy is bad companies cut down on spending (like buying software from a software company). So jobs may be harder to find. In 2002 when I graduated most of the software companies at the job fair were not hiring software people...

  3. Most university programs teach theory not practice. The best example I can think of is networking class. It taught about transmission mediums, network layers, etc. but ultimately it did not show me how to set up my home network. With a lot of classes unless you taught yourself the practical application on your own, you just know the theory. The thinking is the theory makes it easier to learn the practical aspects. But you will find employers want the practical. They want someone who can do ASP.NET. I learned (well reviewed) C++ at college, I never bothered to learn ASP.NET because I couldn't be bothered to pay for MS stuff. ASP.NET is just VB.NET or C# which is similar to Java which is similar to C++ usually with a bunch additional API's which are easy to learn (but will still take some time). Employers just want someone who can do ASP.NET. The same applies to Java. Maybe you know Java and have used it in various projects (I took a Java class in school which covered the basics of the language, some libraries, but again focused on the Java Virtual Machine and the theory) but do you know Spring/Hibernate. Have you used JDBC to hook it up to a database? Basically employers want the practical stuff, not the theory.

  4. Also employers like to pigeon hole people into a job. If at your last job you were doing Java development with the Spring framework. You survived college. You know how to program. You know a lot of higher math and have strong problem solving skills. Even if you don't know technology X using your background in the theory and other similar technologies you can probably learn it pretty easy. Employers would prefer not to take the chance and just to hire someone who used that exact technology in a previous job. You have an advantage here because you did not have a previous job. But by the same token it is a disadvantage because you have no job experience. Many will see it as taking a risk on you. Also in college you won't know many of the technologies they want. So it may take some convincing to get someone doing ASP.NET or JSP to hire you if you have no experience in it when they can just hire someone from a different job to do it.

I would also add your choice of a first job is important. If you work with a narrow technology there is a good chance you will be pigeon holed. If you get to work with a variety of technologies and learn a lot it leaves later options much more open.

And don't be discouraged. You can learn most of the technologies. The problem is you can't learn all of the technologies or you'll drive yourself crazy. AJAX (which framework), ASP.NET, JSP, Servlets, Ruby on Rails, Django, WxWidgets, GTK, QT, Boost, etc... Over a long period of time you could learn the technologies. But in the time frame that you want to get a job you can't and if you try you'll drive yourself crazy. Your best bet is to find a small company and grow with them.

PHP and mySQL may be worth learning and creating a simple website to read your resume from a mysql database. There are a lot of jobs with PHP and MySQL these days. I don't know PHP myself but there are many jobs posted for it everywhere.

I moved these 4 comments into the main post. If you want to roll back that's fine, but if you're OK with the change then you can delete the comments here. I just thought that since you were adding to, instead of commenting on, the post it belongs in the answer.
Kyle Cronin
Thank you very much, I didn't even know you could delete comments :)
Wish I could upvote this more than once...all four are excellent points about the real world.
Adam Neal
+20  A: 

How important communication and people skills are.

In college, you can walk away from the people you don't like or don't understand. You get together with your clique and friends. Others you don't like you just avoid, or you may decide to pick on them or even get in a fight with them or the other clique.

At work, you are expected to work with everyone on a professional level. You are expected to put a certain amount of your self-centered ego aside, and be polite, forthcoming, accurate, factual, friendly, helpful to the people you work with. Most of all: not taking things personal nor making your job a personal issue. Not talking behind the backs of others about their bad work, bad mouth, bad behavior, bad smell, bad ideas.

That's not something one necessarily learns in school or college. To the contrary.

Over time, you will find that there will be people around you that you like personally but actually are nothing but trouble for your job. There's people so grumpy you don't even want to approach them, but yet your job requires that the two of you sit together several times a week. There's people who would totally agree with you but you spend a full ten minutes discussing a subject without realizing that you want the same thing, you're just expressing ideas differently. There will be people that will give you a scary feeling simply by entering the room, and you'll be relieved it's someone else they want to talk to. There will be the factual leader who gives you the feeling he's setting you up for failure, questioning you and you get nervous every time he's only walking by. There will be the jerk who is actually kind of nice, but whenever you're spending lunch together you can't help but think that the others may look down upon you just by being his company. There's of course the guy who is intimidating, shouting in meetings, placing the blame. You don't want to get anywhere near him when he's "in a mood". But you have to.

These are just some of the social situations you will find yourself in when you pick up a job.

Interesting aspect.
David The Man
The last part, sounds very much like in academia.
+47  A: 

The lack of professionality all around.

When I was studying I had this idea that when you got to be a "professional", things would get done the way they were supposed to, because money was on the line. The reality is things get done as cheaply as possible, because money is on the line. The amount of corner-cutting that happens "in the real world" would get you flunked if you tried to pull it at school. I'm not even talking about just the programming side of things. Corners get cut in all aspects of business by even the largest multinationals.

Also, the absolute shamelessness with which turds get polished. I've seen products that get sold at thousands of dollars for a single license, with fancy websites that portray them as an industry leader, and that had code that could only be classified as embarassing.

It's made me a strong believer in open source, or at the very least the concept of selling the source along with the product. If they can cut corners and hide that fact, they will.

Joeri Sebrechts
I was just about to write an answer like yours. One vote is not enough. ;) It was a real eye opener to me when I realized that the world isn't run like tuned clockwork but rather like the temporary contraptions you build at home with duckt tape and scrap parts.
John Nilsson
"even the largest multinationals" - i'd say especially by them.
Matt Joslin
+2  A: 

Once I had to start working at it full time everyday I just didn't enjoy it, or could stay sane, any more. Burnout became a chronic condition. That is more my reaction to it than the industry itself, but I hadn't really imagined what working in the industry was really like in everyday terms.

+4  A: 

The surprising thing is that many companies are earning lot of money by having only 15%-20% good developers, rest of them are quite bad. It is the team thing you see.

+1  A: 

In college you could still get most of the marks from a program that didn't do anything special, e.g. if you wrote just the error-handling part of the program and not one more line than that you could pass an assignment, whereas in the real world this gets you beyond nowhere as some will say, "Duh, no user will put in the wrong values for your program!" which isn't totally right of course.

One surprising point is how short most code can be. Only a half dozen lines of real logic are needed in lots of cases as the rules tend to be very simple, at least I've found.

I wish I had known more about what kinds of working environments there were and what kinds of software development methodologies are out there in the real world as when I was in university there was Waterfall and that was it.

JB King
+13  A: 

I hate to say it, but what surprised me most was the sexism.

When I was in school, the gender ratio for the tech classes I was in was roughly 50-50. I thought since technology was such a modern thing, the people that were into it would be modern thinking about everything. Boy was I wrong!

I realize tech is a male dominated field, but I never thought that would mean I have to be ten times better at programming than the men I work with in order to be even given a chance or taken seriously.

I love to code, but if I knew the industry was like this, I would have chosen another career path and coded just for fun.

What school were you in where the gender ratio was roughly 50-50?
Dour High Arch
I'm jealous of 50:50! It was 10% at my uni. It's one reason why I spent a year as a teaching fellow.
A guy upvoting this. I haven't seen this first hand, but you are spot on about the ratios. My classes in the 80's were more like 70-30, but in my entire career I think I've worked with 3 female programmers (and two were on my first job). **Something** has to have gotten rid of them all, and that would make sense.
+4  A: 

Most everything that you are taught in college is seriously outdated. Be prepared to hit the ground running.

+4  A: 

Well, my first company surprised me with all things I didn't know. Second it surprised me with the absolute lack of professionalism and third one with huge money wasting :)

The way you will be surprised depends purely on the company for which you will be working.

+1  A: 

The value of experience. As you grow as a developer, encountering a bug becomes less and less of an issue. You begin to recognize the same mistakes people make over and over, and can quickly identify the cause of a problem as you see it happening.

Starting out, I thought I knew as much as someone with more experience, but what they had that I didn't was that keen ability to identify likely causes that would take a beginner a lot more time to figure out. It may sound like a simple difference, but the only way you can learn this is through experience. That experience can save days of work some times.

Jesse Kochis
+12  A: 

You will start to "get" most of the Dilbert cartoons you see. You will then also realize that most of them are based on truth.

Loki Stormbringer
+3  A: 

Academia is an echo chamber. What echoes back and forth is what is currently popular on the conference circuit, and it forms a positive feedback loop that always seeks the latest bandwagon.

In the real world, there's a whole new thing, concrete reality, that dominates.

You can see this in the way academics vs. practitioners discuss things. Academics get hot under the collar and form competing schools of thought because what they're really after is wooing editors to publish their papers so they can get prestige and hopefully some job security. Practitioners, on the other hand, tend to be more calm and pragmatic (and no less intelligent) and while they may disagree, the ultimate arbiter is whether they can get problems solved.

Another difference I noticed is that in academia, "smartness" is valued. How often do you hear "Prof. X is really smart", and that forms sort of a currency. In the real world, it is more important to be pragmatic and a team-player.

Mike Dunlavey
+1  A: 

As someone who is 2 years out of college, I have a fairly recent take here as opposed to the more grizzled veterans.

1) Unless you went to a pretty exceptional college or studied independently quite a bit, you will know next to nothing about what it takes to actually get software written. Academia teaches you the bare essentials on what you need to survive in the computer programming industry, it's up to you to expand on it.

2) Prepare to work horrible jobs unless you commit to continue expanding your knowledge. Complacency will land you in a 20 year career of Access databases and classic ASP site maintenance pretty damn fast.

3) Be prepared to not always take the best path. Academic programming teaching does have a tinge of idealism to it. They'll show you some fairly Point A to Point B solutions and everything in between, but a HUGE part of software maintenance, especially in fast paced environments, is working with what you've got. Your eCommerce framework doesn't support web services? Oh well! Guess you'll just have to figure that stuff out, etc, etc.

4) PHP is horrible.


How hard it is to find a good mentor ...

When I went to my first job, I just copied what was in place, and I copied what the senior developer did. I figured all programming was the same and that everyone did it this way. Then I moved to another job where I was the most experienced .NET and Web developer. I was learning nothing, and only having 4 years experience, I was being asked to mentor other people. I finally found a job where I have 3 (actually 5 - 2 business side, 3 programming) mentors that have taught me more in 2 months than I have learned in 4.5 years as a programmer. This leads me to the next item:

Finding the right programming job is very hard

Coming out of college, all I wanted to do was program. I didn't care what it was, I wanted to do it. This was until I realized how much I loved to do web programming. After 4 years "on the job", I realized I didn't want to do Windows programming anymore, I wanted to do web programming. I then realized the place I was working at was HORRIBLE. I absolutely LOVE my new job, I absolutely HATED my old one. It only took me about 1 year of looking to find this job, but I am so glad I waited for the right one.


Unless you were lucky enough to find a serious software company, be prepared to work with a bunch of business-major programming hobbyists. I'm not implying anything good here. They generally are clueless and do things just to get them done. So, you end up with a terribly designed codebase and there is no better candidate than someone right out of college to be responsible for maintaining this mess. If you do happen to be at a place like this, try not to stick around for longer than 1/2 years. It'll probably be blatantly boring, monotonous work that doesn't have anything new to offer anyway.

If you were lucky enough to find a serious software company, get ready to learn things you should have learned at school but didn't because schools are stuck in theories and software engineering ideals that rarely apply anywhere but in schools.

Finally, get ready to keep up with technology. It's changing faster than you can blink. Consider starting a blog where you can document material pertaining to your profession including issues you run across, design decisions, keynotes on new technology that you find interesting. Not only is it useful to use it as your personal knowledge base, you also help out your community of developers. Consider contributing to an open source project. That stuff makes your resume look pretty. Employers love people who love their profession so much they're willing to work on projects on their time off.

Best of luck ;)