« Correct way to handle mobile browsers | Large Problems in Django, Mostly Solved: APIs »
Updated at the bottom of the post.
Warning: This is a bit of a brain dump.
In the software industry there is a lot of back and forth about the value of a college degree. This post won't go into that too much, I just want to talk about the notable things that were left out of my Computer Science degree. Mostly things that are used in the day to day environment outside of a university, but aren't used extensively inside of them.
My degree was a more classical CS degree, which focused on algorithms and theory. However, there was a decent bit of actual "real world" knowledge that they tried to impart. After being at a real job for over a year, I think it is interesting to look back on what I wasn't taught.
In college, the concept of testing was basically 'compare your work against this expected output file'. Sometimes that job was automated, other times it wasn't. There was absolutely not concept of an automated test suite. However, I think that this may be a limitation of the semester long class idea. A lot of the value from testing comes from things that are real (production, refactoring) or looking back at code that you wrote a long time ago. I have a lot more thoughts on this, and it deserves it's own post. However, it was certainly a glaring part of what I do now that I had no experience with out of school.
In the classes that I took, we simply submitted the work to the teacher and that was that. We didn't check it into a repository, or even version the work we were doing locally. At the time the whole DVCS movement wasn't quite as big, so I can imagine a lot more people doing local versioning now. I think that the fact that viewing other students work is sometimes considered "cheating" (which is silly), makes it difficult to have a shared repository for all students.
A big problem with universities is that knowledge the old mindset that sharing knowledge is cheating. Luckily mine was a bit more enlightened, but I think having a shared repository of code would make this philosophy a bit too "real".
We had optional classes that offered PHP/MySQL based website making, but nothing in the curriculm about web development. It seems that in this day and age, so much of what we do is centered around the internet that ignoring it in the classroom is silly. That may be the fact that I now do web development, but I feel that someone coming out of a Computer Science degree not understanding the basics of Web Development is a bit silly.
Our code in university only had to be written once. There was no concept of going back and looking at old code and fixing it. It is one of those realities of everyday work that is totally ignored by universities. I think this one may be a bit hard for them to teach, but mostly because of systematic problems.
I think that a lot of the problems come from the Single Semester Class Paradigm. You do some kind of programming for a class, and then it disappears into the ether never to be seen again. A lot of the value and reality of coding is that you write code and then have to keep changing it and making it work.
Imagine if you were tasked with writing code your first year. This code was checked into the schools version control system in a branch of that class for that semester. Then in your following year you have a class that recalls that code, and you update it with some new technique you have learned. You are a bit dismayed at how badly you used to code, and how hard it is to understand.
Then your third year you go back to your code and have to write tests for it. The class that you had taken the year before is tasked with taking your code and adopting it for a new purpose. They file bug reports on your code, and your commits fix their bugs and contain tests. This allows you to learn how to do maintence, interact with a bug tracker, and write tests. For the younger students, it allows them to figure out how to write good bug reports, and interact with other coders.
I think the really important part is that your code doesn't die. You write code in a class, and it is used by other people, or it is kept and brought back up later. This you as a student to reach the "aha" moments where you see how much you have learned in the past year, by how much your old code sucks. It provides a lot more knowledge of useful tools and real workflow. Without too much effort, it makes the educational nature of college more valuable and more realistic.
I would be interested to hear people's thoughts. If you got a degree, did they do anything similar to this? Are you using up tools and practices?
As a bonus, I think that a lot of the parts missing in universities are missing in good real world software shops. There are a lot of software houses that don't use version control, write tests, or use a bug tracker. This strikes me as crazy.
A lot of people in the comments have said that computer science is more about math and algorithms, and that it shouldn't teach you these things. Most people who take this stand say that you shouldn't be teaching programming at all, and it should be a more math based education. I agree with that point of view, but that isn't how CS is taught these days.
CS students are doing a lot of programming, and performing tasks that could be made better with these use of tools. I am simply arguing that if you're going to be teaching programming to CS students, you should also teach them the best practices and tools associated with that craft. It would only take 1 or 2 classes out of a CS curriculum full of theory and math based classes.
Posted at 9:46 p.m. on November 10, 2009
Comments: 17
Tags: education , philosophy , teaching , testing
Migrating Django Test Fixtures Using South
Announcing Django Crawler and django-test-utils
Django stands for Awesome
Welcome to the home of Eric Holscher on the web. I talk about software development, mostly in the realm of Django. I am interested in the real time web, testing, mobile apps, and other things.
Why Read the Docs matters
1 week, 5 days ago (Comments: 7)
Read the Docs Update
9 months, 4 weeks ago (Comments: 2)
Using Reviewboard with Git
1 year ago (Comments: 0)
Read the Docs Updates
1 year ago (Comments: 1)
Handling Django Settings Files
1 year ago (Comments: 12)
Required Reading
1 year, 2 months ago (Comments: 0)
Using Haystack to index non-database content
1 year, 2 months ago (Comments: 4)
Correct commands to check out and update VCS repos
1 year, 2 months ago (Comments: 0)
Site upgrades
1 year, 2 months ago (Comments: 0)
Building a Django App Server with Chef: Part 4
1 year, 2 months ago (Comments: 1)
Setting up Django and mod_wsgi
Building a Django App Server with Chef: Part 1
Screencast: Django Command Extensions
Big list of Django tips (and some python tips too)
Handling Django Settings Files
Lessons Learned From The Dash: Easy Django Deployment
Large Problems in Django, Mostly Solved: Delayed Execution
Building a Django App Server with Chef: Part 2


Comments
1 aleksandar says...
You are reading my mind.
Posted at 9:05 a.m. on November 11, 2009
2 fruits says...
It seems colleges all over the world are the same.
Posted at 11:22 a.m. on November 11, 2009
3 ohMan says...
Depends which university you go to. Mine had a mandatory course on legacy systems (including database-enabling and web-enabling a fixed field file format C program) and mandatory use of CVS in at least one other course (assessment required multiple checkins of assignment work over a period of time and multiple appropriate commit-log comments).
Posted at 11:44 a.m. on November 11, 2009
4 Truth says...
I'm with you on that my friend. Not only they don't teach us Web Programming, there are much bigger issues with education. When it was time for me to enter the college, I was appalled to find out that there will be no GUI Programming classes, no AJAX Programming classes and no IPhone Games Programming classes.
Confused with this situation, I went to a head of department to inquire him about inadequacy of the program, only to discover that he doesn't even know what J2EE Enterprise Beans are. Can you imagine that?
Needless to say, I decided that my time is better spend on a work that'll give me more real world programming experience. And now, after six years, I'm a Leading Architect of Best Enterprise Web Pattern Practices and Technologicalities at Honomolulu Consulting Inc. and in all this time, I've never ever had to write a single line of code.
Best of luck.
Posted at 12:05 p.m. on November 11, 2009
5 Batman says...
I completely agree. I graduated from a New York City University with a 4.0 in computer science and am having trouble finding work because I have little web development experience. I have been learning web development and version control myself for the past year. I have even asked my school where if they offered any formal classes in this area and unfortunately they don't. Where are you supposed to learn these things? Teaching things to yourself is great but I feel like I often miss out on best practices this way.
Posted at 12:29 p.m. on November 11, 2009
6 Matt says...
My degree was also theory/java based. Many of my professors stressed learnin the underlying concepts rather than the technology used to implement them. I recall one teacher saying, for most cs topics in an indergrad program, the lqnguage didn't matter and would likwly change in 10-15 years anyway. What is frustrating as a job seeker is when an employer focuses on the lack of experience in technology x they brush off my attmpt to sell them on my relevent experience in technology y.
Posted at 1:56 p.m. on November 11, 2009
7 Alex Gaynor says...
The correct answer to what to do about all of this is nothing. None of this stuff should be relevant to a computer science course. "Computer science has as much to do with computers as astronomy does telescopes".
Posted at 2:30 p.m. on November 11, 2009
8 CodeJustin says...
Ya, I'm hoping that I actually get more of a theory-type education though, since the problems you've listed (besides testing) are "real-world" learning experiences.
Posted at 3:36 p.m. on November 11, 2009
9 Adam says...
College isn't supposed to teach you this stuff. College is about learning math, data structures, algorithms, and efficient implementations. You have your whole life to learn software engineering practices. It's not like any of that stuff is hard. What's hard is writing a compiler or operating system from scratch (and efficiently, too).
Posted at 4:35 p.m. on November 11, 2009
10 Arnold S. says...
Here in Kalifornia, we have very many community colleges eager to teach you valuable job skills. We are also blessed with Universities which will teach you design and leadership skills so that you can become a great research scientist or business leader, instead of a hack coder, soon to lose your job to someone overseas.
In my beloved Austria, sadly, University degrees are mostly padded with courses in military drill, body-building, and the biochemistry of steroids. These are enormously practical, and I wouldn't have my swell job without them, but I do regret not being unable to discuss issues with anyone smarter than a "blood and guts" moviegoer.
Maybe I will learn PHP and CVS soon.
Posted at 5:59 p.m. on November 11, 2009
11 jm says...
Nothing you mentioned really has anything to do with Computer Science. CS is a specialized degree in math and I've been saying for years that anyone who wants a job in the IT industry as a programmer has no business in a CS program - it'd be a waste of a degree anyway.
Testing and version control are probably covered in Software Engineering.
If you want practical experience, get a diploma at a vocational school - I hear they get quite a few CS and Software Engineering grads looking for practical skills.
The title "Computer Science" should be changed to "Computing Science" - it's a study of computation (math!), not of computers and software as we know them.
Colleges and Universities really need to start telling potential CS students these facts. I asked these questions before starting CS and no one could give me an answer. I had to figure it out for myself; now I have a genuine interest in computing as a science but find myself miserable with programming jobs managed by people who have no concept of the depth of my knowledge. The kind of industry position that really makes use of computing science requires post-graduate education. Which is my next step.
Posted at 6:10 p.m. on November 11, 2009
12 John Shimek says...
In my last year of college, one professor started a new project class. We had to apply with resumes to get accepted. There ended up being 12 (maybe 13) of us. We started a project with the professor as the our advisor. We used CVS, Bugzilla, had weekly meetings, 2 week milestones, and open sourced our work. It ended up being on of the classes that I learned the most from. And then the next year another dozen students continued on from where we left off on the project. If you are interested in how smoothly the hand off went, ask Leah Culver cause she was in the class the next year.
Posted at 7:14 p.m. on November 11, 2009
13 Pip says...
My experience at UCI (University of California at Irvine) as an ICS (Information && Computer Science) major between 1995 && 2001 (much part-time while working) was largely similar. Maybe we had a class or three consecutive quarters that might have us personally use RCS or CVS, we weren't contributing to our whole university's public shared code-repository. Blah. Here's all the code everyone ever submitted for assignments, tests, etc. in our entire school is right there for all followers to learn from. Dope!
While I agree that "Computation Science" is much more prettily packaged as exclusively && harshly about algorithmic efficiency && mathematical computation concepts with adamant emphasis on theory, I rather personally contend with the sentiment. Devoid of context, theory lies fallow. Comprehending theoretical discourse compellingly requires a basis in practice, pragmatic fundaments, actually cutting your teeth into some fscking code that matters to you.
I dropped out to make mostly PlayStation video-games, since I kept failing theory classes where I'd stubbornly contend that I had already actually coded enough on my own && under employ that I descriptively refuted crucial precepts of the professor's history of development life-cycles research, textbooks, etc.. I learned what I could, but I taught myself much more (coding-wise) apart from the prescribed curriculum. I think my counselor finally intervened && let me move on from the pre-requisite course after I was failed three consecutive quarters. Fsck that shat. He insisted on teaching everyone a lot of wrong, yet presumed uncontestable, antiquated modeling garbage. Conceptually: "plausible". Actuality: "bogus". To force-feed theory as well-established fact, decoupled from the constraints of having verifiably executable forms, becomes an ivory-tower circle-jerk of ComputerScienceMathematicianGandalfs blast each others egos to new pinnacles, but it also seems to keep them distracted from the trees joining the war... or maybe their unquestioned tenured status at pinnacles are themselves effectively theoretical, but would make a great basis for the theory of theory.
Note: I had to split my comment-post since it exceeds your seemingly arbitrary 3000-character limit. Maybe I've written too much though too. -Pip
Posted at 5:51 a.m. on November 12, 2009
14 Pip says...
Note:This comment post is a continuation from my prior one.
My favorite class was offered jointly with art students to form teams to make games. This was the conclusion of a year of similar classes (without artists) focused on coding OpenGL (including vector-math theory). Our team became intense friends toward the end, making UCIShowDown, our meager fighting game (with interactive animation key-frame editor... && decapitation fatalities! ;) ). Best classes. Not many others taught building upon && maintaining code-bases collaboratively. Maybe with MIT opening so many rad CS courses, theory will be increasing signal-to-noise.
We'll see. I'm pretty sure online education (even in SecondLife or whatever) is poised to surpass campuses for a lot of technical qualities, but I'd like to see traditional colleges stay relevant (for educating scientifically on computation) if possible (knowing they'll remain relevant for many more pressing social purposes in our own HarryPotterDormTowers). Heh, I just remembered that the on-campus UCI dorms are MiddleEarth && named accordingly. Potter in MiddleEarth, Frodo in WoW, mash-em-up. I think it works. So I was saying colleges should teach, or at least better facilitate learning. I'll part with vaguely remembering it being fun to learn communally in the lab as we were tasked to login to probably Bourne shell && manage
vito work on code-files. I think discussing it segued nicely into general editor dialog with most coders experienced prior with VisualStudio, SlickEdit, QEdit, or just MS-DOS edit.com. There wasn't much pre-existing Unix experience (for Vim, Emacs, etc.) among my classmates, but it was good to find opportunity to learn real standard practices of the Unix (&& now GNU/Linux) Philosophy.There's my 8-bits byting. ;}
Shalom, -Pip
Posted at 5:55 a.m. on November 12, 2009
15 Chris Adams says...
I'll second the update about what CS should be - the people who seem to think these points aren't relevant are engaged in pure unnecessary pedantry (on the internet, no less!). CS definitely shouldn't focus on the latest business language du-jour but it's just absurd to ignore the fact that the vast majority of people with a CS degree will end up writing code for a living - even in academia.
Basic programming skills are really akin to basic literacy for people in a technical field: people in fields with nothing to do with CS are taking programming courses because most of the interesting work involves things like interacting with other people's programs or working with non-human-scale data. Two jobs ago, I met a fair number of bio-CS/SE dual-majors who'd chosen that somewhat new combination because most of the remaining interesting questions required you to be able to do things like analyze terabytes of data, possibly in realtime, and come up with advanced systems for displaying or reacting to it. The people who were comfortable that their programs worked reliably and correctly all had some CS/SE background and already understood things like version control, testing, basic techniques, etc. which everyone else was rediscovering in a series of painful learning experiences. Those people also had the easiest time collaborating because their process was a lot more thought out than "Here's a zipfile with every MATLAB file I've written in the last two years - fiddle with it until you think it's doing what you want" - and in science there's quite a lot to be said for not scaring away potential collaborators.
Posted at 1:23 p.m. on November 12, 2009
16 rehan says...
college's only follow the way to make money
Posted at 12:03 p.m. on November 16, 2009
17 forex robot says...
nice post. thanks.
Posted at 7:40 a.m. on November 19, 2009