50

A lot of students when they graduate and get their first job, feel like they don't really know how to program even though they may have been good programmers in college.

What are some of the differences between programming in an academic setting and programming in the 'real world'?

6
  • Example: techcrunch.com/2011/11/12/…
    – rdasxy
    Nov 13, 2011 at 8:48
  • 4
    I would say that in academia you learn in-depth: you learn concepts, ask yourself questions, improve abstract thinking. In industry you learn in-breadth: you learn to use many different technologies without asking too many questions, you have to get things done. Through experience in the industry you also learn to manage large, complex projects: this is a very practical issue which you cannot learn at university for lack of time.
    – Giorgio
    Nov 13, 2011 at 9:36
  • 9
    Is this question asking about academic on the phd level, or after graduation, or just a general, "classroom vs real world" setting?
    – Bob
    Nov 13, 2011 at 15:15
  • @Bob. This was more about general academia. Classroom/research/directed readings/assignments vs. "real world" programming in industry.
    – rdasxy
    Nov 14, 2011 at 5:18
  • Ok. That wasn't very clear, because there is such thing as "academic programming" which is done by people who want to say, help biologists figure out cell simulations.
    – Bob
    Nov 14, 2011 at 8:06

14 Answers 14

72

In a traditional undergraduate computer science program you learn just programming. But the real world doesn't want people who are just programmers. The real world wants real software engineers. I know many job descriptions don't seem to express this distinction, which only confuses the matter. In the real world you need to be able to:

  • Gather and analyze requirements when they aren't directly given to you
  • Design and analyze architecture with near endless possibilities
  • Create test plans and act on them to evaluate and improve the quality of a system
  • Work collaboratively on a team of people with different backgrounds and experience levels
  • Estimate and plan work even if you don't know exactly what to build
  • Communicate effectively with stakeholders who have different needs that don't necessarily align
  • Negotiate schedule, budget, quality, and features without disappointing stakeholders

Oh yeah, and you also have to be able to write code too, though that takes, on average, only 40 - 60% of a software engineer's time.

So, it's not that freshly minted computer science undergrads don't know how to program (many are in fact, very good programmers). It's that many of them don't know how to do anything else.

2
  • 19
    Oh yeah, and you also have to be able to write code too, but that's, on average, only 40 - 60% of a software engineer's time. - Or even 0-20% at really bad and really large corporate shops. Nov 13, 2011 at 21:56
  • 2
    +1 for a very good answer and +1 (should be more) for Ritch. If a s/w engineer is spending more than 20% of a project life-cycle on coding then something is very, very wrong. 50% design, 30% test, %20 for the rest .... everything else, including coding seems about right. With proper design, coding should be trivial. Without it, what people call "coding" is actually endless rewrites, trying to hack together a design of some sort as they go along </rant> Nov 21, 2011 at 1:07
36

At University...

Your teacher gives you:

  • A well defined, isolated problem, the solution of which can be provided within a short and well-defined time span (and it will be discarded afterward)
  • A well-defined set of tools that you were introduced to prior to assignment
  • A well-defined measure for the quality of your solution, with which you can easily determine whether your solution is good enough or not

In the "Real World"...

  • The problem is blurry, complex and embedded in context. It's a set of contradictory requirements that change over time and your solution must be flexible and robust enough for you to react to those changes in an acceptable time.
  • The tools must be picked by you. Maybe there's already something usable in your team's 10-year-old codebase, maybe there's some open source project, or maybe a commercial library or maybe you will have to write it on your own.
  • To determine whether the current iteration of your software is an improvement (because you're almost never actually done with a software project), you need to do regression testing and usability testing, the latter of which usually means that the blurry, complex, contradictory, context-embedded requirements shift once again.

Conclusion

Programming in school and programming in the real world are so inherently different to the point where there's actually very little overlap. CS will prepare you for "real world" software development like athletics training would prepare an army for battle.

1
  • 12
    This is basically what I was going to answer. In school you know the problem and you know the solution. In the "real world" you rarely know the solution, and often don't even know the real problem.
    – Bob
    Nov 14, 2011 at 8:09
20

They face a different aspect of the problem:

Academia is mainly focused on the "science of programming" thus studying the way to make efficient particular algorithm or developing languages tailored to make certain paradigms more expressive. Industry is mainly focused in producing things that have to be sold. It has to rely on "tools" that are not only the languages and the algorithms, but also the libraries, the frameworks etc.

This difference in "focus" is what makes a academic master in C practically unable to write a windows application (since we windows API are not in the C99 standard!), thus feeling as it is "unable to program". But, in fact, he has all the capabilities to learn itself what he's missing. Something that -without proper academic studies (not necessarily made in Academia)- is quite hard to find.

0
10

Good answers. Let me just add, academic programming tends to be almost toy-like in scale. This is good for teaching. As a teacher, you are trying to convey ideas most efficiently. The downside is realistic programming is so qualitatively different, it's hard to bridge the gap.

One area of difference is in performance analysis. I've written many posts trying to point this out. Performance analysis is only superficially about algorithms and measuring. To do it really effectively, you have to approach it as a process of debugging.

Another area of difference is maintainability. This encompasses everything from style to domain-specific language design. You can't do it effectively unless you actually know what you're trying to minimize.

These things are not taught, and they make an enormous difference in productivity.

7
  • 1
    I wonder how these things could be taught, since they require a lot of time and experience on the field to acquire. I was assisting a software engineering course where teams of 10 students each had to develop a small software product in a few months (two semesters, from October till April). This allowed them to get a feeling about programming, planning, prioritizing requirements and tasks, communication, and so on. But, of course, this is little compared to what they will face in the real world. But you cannot spend 4 years study only on this.
    – Giorgio
    Nov 13, 2011 at 17:46
  • @Giorgio: For performance, I have a pre-existing code base (not very large) that I show how to optimize though a series of iterations, getting large speedup factors. It's an easy skill to teach. For DSLs and maintainability I also have some favorite examples that could be used for teaching. Both of these could easily fit into a semester course, with room to spare. So I think it could be done. Nov 13, 2011 at 17:53
  • 1
    Ok, I understand: use large, real-world examples and let the students work on them. Very good idea.
    – Giorgio
    Nov 13, 2011 at 17:58
  • @Giorgio: I was a professor 30 years ago, so I still remember some of how to do it. I also put these ideas into a book that sold poorly, which only means I've had time to think about and explain how it all fits together. Nov 13, 2011 at 18:03
  • I do not have so much experience, I was a teaching assistant for a few years during my PhD time. I now work in a company. Regarding programming at the University, IMHO the truth is somewhere in the middle: There is some very useful teaching at University but it is difficult to cover all the important issues that a software engineer will face through his / her career. With some effort, you can really teach some real-world things, as you have pointed out. Not all university professors are willing to do it of course.
    – Giorgio
    Nov 13, 2011 at 18:10
8

In the academic world, most people study computer science or related courses. Dijkstra once observed that "Computer science is no more about computers than astronomy is about telescopes." A person studying computer science is first and foremost learning to become a scientist, and not a programmer. As a programmer, he'll stay an amateur, and the transition to a professional programmer is accordingly hard.

8

Update: As if someone was reading my mind: Graduate expectations versus reality...

My take, two other factors:

Problem size: In academia, I mostly had to develop software "from scratch", which meant that most of the time, the largest program I had encountered was the largest one I wrote. This de-emphasises the necessary capability to handle and cope with complexity that emerges from different pieces of software interacting together. If I was aware of the effort needed to comprehend with complexity, I might have chosen not to be in the industry at all.

Reading VS Writing: Another side effect of problem size is that often, in the "real world" we are exposed to work that has been written by others, either for maintenance purposes (I did no maintenance in academia anywhere), extension, or simply division of labour. Therefore reading code becomes many times more important than writing it.

A proposal for improved programming education: Academia should expose us more to real-world situations without regressing to vocational training. Doctors have to face a corpse at some point to see if they are "made for it" (I've heard stories of people dropping the course after this experience). If I had seen in my early twenties a 20K LOC project comprised of different programming styles, which I had to understand in one day and amend a bug in three, I might have considered other career options -- though probably not.

2
  • To extend your metaphor and from my own experience in medicine: doctor's learn general concepts in medical school, but all of us learn the nuts and bolts and the real world short cuts in on-the-job training as interns and residents. Nov 18, 2011 at 16:32
  • 2
    This! The first time you dive into a 1 million LOC codebase you realise that this isn't going to be anything like everything you've done at university. It is clear very quickly that you will never comprehend the entirety of that codebase, and whatever you do comprehend must come from reading and understanding other people's code, rather than from architecting and writing your own. Dec 2, 2013 at 12:18
4

The biggest difference I have found between academic vs industrial programming is regarding robustness. Most everyone has experienced the "it works for me" paradox in their career, and this is an extension of this condition. In academia, the focus is on the algorithms and functions and little regard is placed on the usability and stability of the software under everyday conditions.

For example, at my office we have an engineer that will take the software and is a master at causing crashes from corner conditions. He will click on a button as fast as he can until something crashes...if an operation takes too long, he will just start clicking randomly around the screen (out of frustration? IDK....)

Changing our programming philosophies so that we make things "Steve proof" has in general improved the stability of our application.

4

I have zero personal experience with programming training in school--I was an English major. Ask me about Keats and Byron!--but I have received several new grads and brought them up and mentored them in the world of professional software development. So I can speak from that perspective.

My experience is that really ALL they got from their schooling was an interest in programming. Their skills varied from zero to negligible. Their ability to self-direct was nonexistent even in the highest-skilled of them. Their thinking wasn't just small-scale; they actually thought in miniature. A system comprising more than a couple dozen lines of code made them fall entirely to pieces.

But you know what? They acquired an interest, and that's a big deal. An interest is plenty. I can work with someone who's interested. I can turn them into a developer, provided they come to me with an interest in being one. Hell, that's all I started with. That and an appreciation for post-modern American novelists.

2

In academia,

DRAWBACKS

  • We have deadlines which are mainly to score points.
  • Bugs dont really cause trouble, as most of the projects are never used in real world applications.

PLUSes

  • We get ample time for research.
  • Swaying from the initial objectives don't cause much trouble.

In the industry,

  • We work on projects which will actually be used by corporations.
  • We work under stress of ever changing client requirements.
  • Deadlines are rarely flexible, as that could lead to huge financial losses to both the Software firm as well the clients.

Check this out:

http://www.dodgycoder.net/2011/10/how-to-become-better-programmer.html

1
  • I'm going to have to disagree about the "actually be used" part. During the early-mid 90s, I went 5 years, at 3 different companies, large, small and medium, and nothing I wrote went into production. I don't think this is that uncommon of an experience. Nov 14, 2011 at 0:03
2

Academic programming is more about code it yourself. This is important in learning how it works. Code quality and revision control don't count for much. With notable exceptions, code doesn't have a lifetime beyond the assignment. The scope of projects tends to be quite constrained, and unlikely to creep.

In the real world, you should have as little original code as possible. A lot of code is developed by teams. It is better to use library routines than to code it yourself. Code quality and revision control become more important. Code tends to have a lifetime far beyond what was originally expected. Project scope is usually quite broad and tends to creep significantly if not managed.

1

Actually,

it is impossible to fully distinguish between academic level programming and real world programming.

I'd say the biggest difference might be this: in real world programming - you have to know more than programming, and should be able to adapt fast.

Depending for which sector you are doing work, you have to be in compliance with its laws.

Michael only touched the tip of the iceberg by stating programming related tasks, which I would classify as the easy stuff (if you are worth the dough you are being paid).

In general you'll face at least a couple of challenges per subject in an industry:

  • Governing laws (ex. client confidentiality for medical)
  • Subject know-how (ex. invoicing-tax system, inventory, resource management, medical schemes, industry standards)
  • Client requirements that are lacking or non-existant or differing from industry standards/governing laws

If you compare a research phd level programming project vs. a real world one, chances are they are very similar in difficulty, entrance level know-how and such.

The only real difference then is that the real world project

  • has a client
  • has budgets (time, money, people resources)

It's different ball game when someone else makes the rules :)

0

If you look at the subjects studied in IT in academia, you will find about half of the time wasted in math, science, electives, etc. and the other half on academic subjects such as: Compiler design, Theory of algorithms, Computer Architecture, Optimization, Operating Systems, Digital Electronics, and few other courses related to industry such as C programming and Web Programming.

Most of the above mentioned subjects are nice-to-know but will not either directly provide a strong background in what is required in day-to-day IT.

Take the Microsoft Web Programming requirements (that is, areas required by someone to be a productive team member in an organization):

1- C#.NET or VB.NET

2- ASP.NET

3- HTML and CSS

4- SQL Server (or another database)

5- OO application programming and design

6- Java Script

7- MVC framework

8- Some exposure to source control tools

9- Some exposure to automated testing tools

10-Bug tracking tool

11-E-Commerce Concepts (optional)

12-ORM

13-Some business analysis skills

14-Some communication skills

15-Probably, some cloud computing fundamentals

As you can see that most of the requirements above are rarely focused on (you may get 1 course in some at the most) during college/university.

One can't fully blame institutions since there are many such stacks of technology and they keep on changing.

Most of the above from Microsoft will not help someone who wants to develop applications in Java.

The real problem is that not one of the technology stacks that are needed by the business today is ever covered in full.

The above covers the question of suitability of graduates to business jobs like programming in business environment. The needs to research labs, etc. is not covered by this answer. Also other areas require more skills than the above, such as Game Development, Embedded Development, Real-Time Systems Development, etc.

10
  • 12
    You have 15 items in your list. I guess I could add another 30. It is not the task of academia to teach you all that stuff but, rather, to teach you how to find your way through all that stuff. And also, to have knowledge that will still be usable when all current technologies will be obsolete (in 10 years from now?) That's what all the theory is good for and not a waste of time!
    – Giorgio
    Nov 13, 2011 at 10:26
  • 2
    @Giorgio, thanks for your comment, your point is valid. I have explicitly stated that "One can't fully blame institutions". While the original question is not about the nature of academic education, my poersonal view is that there is a HUGE gap between what academics teach and what the business expects. The bill for bridging the gap used to be paid by the business in expensive on-the-job training. With the great competition and the hard times all economies are going through, I wonder who will pay the price for bridging this gap today?
    – NoChance
    Nov 13, 2011 at 10:40
  • @Emmad Kareem: Yes there is a big gap, I agree. Often university professors do not have a clue of what is going on in the "real world" because they are focussed on abstract research. Yet, it is these abstract thinking skills that now allows me to learn a new language within weeks (learning Scala right now). I also understand that maybe for you the money issue is felt more strongly. I grew up in Italy and when I studied university fees where about 200 $ per year (plus we had to buy the books ourselves). I guess this is very little compared to what you pay in the US.
    – Giorgio
    Nov 13, 2011 at 14:10
  • 3
    Likewise, if you were studying engineering and learning how to build a car, no one would teach you how to drive a specific car: this is just something they expect you to know or learn by yourself.
    – Giorgio
    Nov 13, 2011 at 14:14
  • 1
    Wasted? If you have the degrees you claim to have then you should know better. Even if you are not sitting there programming advanced math the lessons learned in studying it directly translates to "seeing" a clean elegant solution.
    – Rig
    Nov 14, 2011 at 18:04
0

Scale & Focus
From my experiences, in an academic setting, generally the scale of the application you are working on is much smaller, something that can be completed in a day or week, or perhaps as long as the semester by one or two progammers--typically everything you write will be throw-away code that is discarded after the term. In the real world, you may find yourself working on an application that a larger team has taken months, if not years, to fully develop. You spend a lot more time and debugging other people's code, and trying to understand a codebase's infastructure, juggling not breaking the existing parts to add some new or modified requirement.

Requirements, Integration, Customers
Also, there are aspects to developing code, such as requirements analysis, integration testing, etc. that tend to be less represented in academic projects. For the sake of fair grading, typically the requirements are already established for you by the instructor, and it's not collaboratively decided in meetings. You don't tend to have to "sell the customer" on a particular approach that isn't quite what they wanted, but unlike their desires is actually feasible from a techical standpoint. In an academic setting your customer (the grader or instructor) tends to have a pretty concrete idea what they want, in the real world, you may encounter customers who don't really know what they want and have to pick their brain to understand what should be built.

0

Maintenance & Maintainability

In academia (at least at the undergraduate level), software is built with short-term goals in mind, usually to complete some homework assignment or term project. Once the assignment is completed, the code is thrown away and never seen again.

In a professional setting, most software is written with long-term use in mind; software is intended to be used for at least a few years and needs to be built to be easily maintained and updated over time.

Related to this is the work of maintenance. The majority of professional programming work involves updating or maintaining existing software. So-called "green-field" projects are the exception, rather than the norm.

Not the answer you're looking for? Browse other questions tagged or ask your own question.