Let's Not Call It "Computer Science" If We Really Mean "Computer Programming"
codemanship.co.uk
codemanship.co.uk
" I cannot tell the difference by watching them develop software."
I can't disagree with this more. While this may be true of students who were middle of the road students in CS programs. I can't definitely tell the difference between people with a formal cS background and those without in my daily work. I work with a handful of extremely talented self taught programmers but there is definitely a difference between the way they attack problems and think about coding versus the CS folks. Not to even mention the programmers I've worked with who have EE degrees. Those guys think about things and code in an entirely different third way.
All of these people / approaches are necessary... and none of them are better than the others... but pretending like they don't do things different because you want to feel like you don't need a CS degree is disingenuous.
From what I have seen, the ratio of non-clever to clever code in a typical software is 80:20(I am being conservative. It's more like 95:5). The 80% doesn't need cleverness - it needs a lot of discipline and proper abstractions. CS doesn't teach you discipline or proper abstractions. Most of the projects in a CS curriculum are small, done in small teams or solo and are thrown away as soon as the course requirements are met. The higher level CS projects exist just to prove a point(research), or doesn't exist at all except in theory.
I never took the full CS program, but I hit most of the core classes while studying Cognitive Science. By far the most valuable class sequence I took was compiler design; learning HOW a compiler takes code and turns it into assembly language was a revelation to me, and I was able to "see" the relative optimization of algorithms much better after taking that course.
Will I ever need to write a compiler? Probably not, though I have written several small interpreted scripting languages/DSLs. But taking the class expanded my mind in a way that grants me insights a LOT of self-taught programmers I've worked with never seem to have.
Does everyone who takes a compiler design class gain those insights? No, certainly not. It's possible to muddle through just about any class without REALLY understanding it and pass -- some more easily than others.
The weeder classes in CS at my college were tougher than many, though, including one that actually required each student to write non-trivial programs in assembly language.
But back to your comment: It's not that all code needs to be "clever." A friend of mine once CRITICIZED a piece of code for being "too clever," and he was right. "Clever" isn't a goal. But sometimes the straightforward approach made by someone who is good, but self-taught, isn't as good as the equally straightforward approach by the self-taught AND CS-educated programmer.
>The higher level CS projects exist just to prove a point(research), or doesn't exist at all except in theory.
Real higher-level CS projects frequently involve interesting graphics research, which (also frequently) ends up working its way into commercial game development.
I don't have any clue what you mean by "doesn't exist at all except in theory," since even if you're building advanced data structures that you could otherwise pull from a library, you're building something "real" that could actually be used.
> But back to your comment: It's not that all code needs to be "clever."
By clever, I meant code that isn't routine. My definition of clever will include dynamic programming, reducing NP complete problems to known algorithms, writing a parser which takes xml as input and produces python dicts("writing a parser is simple" you say. But compared to the rest of the code in a typical project, it does count as clever)
> But sometimes the straightforward approach made by someone who is good, but self-taught, isn't as good as the equally straightforward approach by the self-taught AND CS-educated programmer.
It's not me who was making general claims. In my post, I did point out that about 20% of the time, CS background is very useful. The OP made the claim that CS and non-CS approach differs in general, which I don't think holds true.
> Real higher-level CS projects frequently involve interesting graphics research, which (also frequently) ends up working its way into commercial game development.
"Real higher level CS" -> http://en.wikipedia.org/wiki/No_true_Scotsman
You don't get to choose what real CS research is.
CS researchers have a lot of commendable qualities, but that requires a different set of qualities than a regular software development project, and CS research doesn't hone their skills as far as regular software dev is concerned.
Look at the code from the academia. More often than not, either there is no code(hence the comment "doesn't exist") or it's spaghetti. I don't see how that helps you write code for the regular projects where you work with teams, code isn't thrown away and you are expected to maintain it. Now, I am not saying CS researchers can't work that way - I am saying what they do for research doesn't help.
The biggest difference is that rigorous CS program will drill this proof-first, implement-later habit in you through repeated exercise. This is very valuable when solving something difficult because you will end up with many trial/errors, and it's much faster to iterate in your head than in an IDE. This habit is also difficult to acquire without deliberate and repeated exercise.
Most other differences are just difference in experience. It'll take a smart programmer+ no time to learn enough about CS theories to adequately solve that 5% of the most difficult part of the job.
+ By smart programmer, I mean someone who have enough intelligence/discipline to graduate from rigorous CS course, but did not.
A formal CS background gives people a very valuable toolset with which to program. It's something you can't fake, and if you know what to look for, it's instantly recognizable.
But if you don't have a CS background, yeah, I could see why it would all look the same to you.
A CS person can easily learn programming; it's second nature to them. But a programmer does not learn deeper theory as easily. Of course it can be learned, but that's why they teach CS at universities and not just programming—it's a much more difficult and more fulfilling subject, in my humble opinion.
This is not true, if you've ever seen academic code...
Code developed by actual academics is often terse, elegant and small; produced either due to a sudden flash of enthusiasm or because of a deeply held and significant urge to demonstrate a point. This kind of code is often at the core of what is known as "academic code".
The bulk of "academic code" is developed by a sequence of postgrads, pursuing individual goals and code is handed round with a mix of suspicion and over enthusiasm, and dropped and adopted according to the whims and short term needs of semi engaged investigators who are make do and mending with budgets and partners. So, by any sane standard it's bad.
On the other hand, it isn't meant to be adopted and used in the long term, and if you are looking at it at all it's because it does things that will be very expensive to replicate, and no one can afford to do a clean rebuild on. So - don't dismiss it if you can't afford to bin it.
Not all comparison are good. I agree that playing music requires skills that you probably don't have if you only studied art history, but this is absolutely not true when it comes to CS and SE. CS and SE both have to do with abstraction, languages, logic, models ...
In my experience, it's easier to teach a programmer CS theory than the other way round. At least the programmer knows what he doesn't know.
All I know is that I look for it when hiring. A Berkeley, Stanford or MIT CS student has a very high weight. They still have to prove themselves, but they definitely have a head start in my book.
I believe this is why so many without strong CS backgrounds are successful as programmers: They bring the design skills often lacking in CS graduates.
Really, it's not like saying an Art History major could easily learn to paint as much as saying an "Art Practice" major could.
Also, I've found that more CS-oriented people often have a good grasp of software engineering--designing programs, keeping them maintainable, ensuring correctness and so on. On the other hand, non-CS people tend to lack knowledge of theory unless they go out of their way to learn it (and most, unfortunately, don't seem to). It's much easier to get by programming at some company without knowing any theory than it is to learn CS without knowing how to program.
Now, there are obviously CS people who spend very little time programming. But, in my experience, they're relatively rare and tend to stick to academia. Really, they're more like math major who happen to like CS than anything else. The ones like that I've met here also happen to be some of the smartest people I've ever talked to, but that could just be a coincidence.
But there is a style of thinking that can come out of a study of computer science that can be very difficult to obtain on your own, and enable you to build larger and better systems than all but the very, very, very best of self-taught programmers, and while it's hard to put that difference into words, it's mostly the study of maintaining invariants in the code from both a theoretical and a practical standpoint. Or, if you prefer, a way of thinking that helps create and enforce a mathematically-strong form of conceptual purity in your code.
Those who don't have this background, and I very much include people who took the courses but just sort of skated through without absorbing anything, will often have problems with any API I create that requires certain constraints, such as being careful at what point they access local information vs. remote information. Their use of the APIs will be sloppy and hacky, because they don't really understand how they work or what they are for. The constraints I am thinking of are purely technical, a particular server/client split, so when I say you can not do X it is not merely me being an academic prick, it is because it is actually impossible to do X because at the time your code runs you are literally in the wrong place. Explaining this fact is easy, but explaining how the system conceptually wraps around this constraint and works the way it does is a challenge.
And APIs designed by such people, while they may get the job done, tend to be very brute force (for lack of a better term) and to lack any sort of firm foundation, such that the moment a requirement even slightly changes we have to make massive (and often hacky) changes to them.
Unfortunately, it is impossible to provide examples in the scope of a single post, because all small examples will not show the issue. It's a larger pattern of issues that tend to start interacting with each other, which is where the real problems emerge.
It is also the case that a proper path chosen through a computer science program will take you through some eminently practical theory that will make you a vastly more powerful programmer, and is very hard to pick up on your own. By far the biggest example of this is compiler theory. If you are currently in college and still have the opportunity to take your local compiler course, take it. I don't write very many "compilers", but I have now written quite a few "interpreters" and it has enabled me to complete projects that could not have been completed any other way. Getting a formal grounding in signal processing is also a good idea, that one can be hard to pick up later and has surprisingly useful intuitions for a lot of high-speed networking tasks. A formal grounding in networking can be good, though a lot of courses unfortunately seem to just march through TCP and the OSI model, which you could relatively easily just read about.
The fastest way to obtain this basic understanding if you are a good programmer but lack the formal education is one of really, honestly working through SICP (and not just reading it), or becoming fluent in idiomatic Haskell, with special concentration any time someone talks about "enforcing invariants via types". (Personally, I believe Haskell has completely supplanted Lisp as "the language to learn to expand your mind even if you have no intention of using it", but be sure you stick with it for a bit. Learning how to string together a couple maps and a fold is not where the interesting stuff is, it's what the interesting stuff is made out of.) Also, break yourself of the subconscious idea that academic === useless. As someone who tends to straddle the border I will completely agree it isn't all useful, but it isn't by any means all useless either.
And just let me reiterate as my closing point that it is absolutely possible to go through even a very good Computer Science program and fail to absorb the useful lessons it has. Presumably these are the people claiming it's "useless". I have to admit I tend to not have a high opinion of people who managed to go through a solid program and come out with nothing. (There are also some complete wastes of programs, so YMMV.)
This isn't to say that Haskell is the only mind-expanding language out there, but it sure is good and it worked for me. I think it makes it especially easy in this regard over ML or Lisp in the "mind-expanding" game because it has so many formalized computational concepts that are first-class and upfront. That's not to say that you can't expand your mind in other languages, but Haskell can really help you out if you're willing to roll with the learning curve.
I disagree with this statement. Python's introspection, first-class functions, magic methods, and duck-typing add a lot of the dynamism of Lisp, but every time you run up against something that needs to be a macro, it's a dead end. C has a rudimentary macro system that can get you a little past that point; for example, it's not too difficult to add a foreach construct to C that looks like this:
queue *q = queue_new();
queue_add(q, 1);
/* ... */
foreach (int i, q) {
printf("%z\n", i);
}
On a sidenote, it's kind of sad that a programming layer just above assembly language created 4 decades ago has better macro support than some of the most popular modern languages.I disagree. In Python, you have much more advanced metaprogramming facilities, depending on what kind of effort you wish to go to. You have the normal introspection, magic methods and metaclasses as you mentioned (which, IMHO, are in themselves already much more powerful than what you can do with the C preprocessor). But you also have access to exec and eval which lets you do all kinds of crazy stuff that isn't possible with C macros. Using operator overloading and classes, you can even create a lot of new syntax which isn't possible in C[1].
Finally, if you are really determined, you can even hack semantics of existing Python constructs by instrumenting the bytecode. For example, I saw a hack which adds tail-call optimization to Python functions this way (iirc as a decorator).
[1] One example is python-pipeline: http://code.google.com/p/python-pipeline/
I have worked with extremely intelligent CS graduates. When it comes to the really involved algorithmic work they leave me in the dust. However every programming job I've ever had has been focused on the other stuff like writing tests and building clean abstractions and maintainable code 99% of the time.
When it comes to this stuff CS grads are no better than any other programmer. In fact, new graduates are often worse because they've never had to build and maintain massive systems over any significant period of time.
Person A spends four years getting a BS in CS at a top-tier school, learning about programming at least for a few hours a day on average, with the benefit of a well-considered curriculum and instruction by wizards.
Person B spends four years working full-time on something interesting at Google, which probably gives her more total hands-on-keyboard time, and also access to some minor wizards, although they may not care so much about teaching her.
Let's say that both of them also spend a bit of time on the side learning programming things not school- or work-related.
If both of them have an equal thirst for knowledge, I just don't see why person A is likely to become a better programmer, or why B would fail to pick up the style of thinking you described (which is common, in my experience, among good programmers.) I honestly think that you're mixing up the consequences of {smart, curious, motivated, spends a lot of time programming} and {took a CS degree}.
Real world might be different, but I don't think a CS degree should be teaching programming at least for a few hours a day. IMO that would be a total waste. There are bazillion of things to learn - database concepts, discrete maths, networks, ai&ml, digital electronics, some basic circuit theory, operating systems...There is programming involved in almost all of the courses, but the purpose isn't to learn about programming. When I am learning about MVCC, I am least concerned about learning programming, but the MVCC concept itself.
Oh, and this expands my Haskell point: http://www.jerf.org/iri/post/2908
However. There is definitely something to be said for SOME kind of structured education for developers. The author's anecdotal evidence notwithstanding, I have met many aspiring self-taught programmers who just don't have it. There seems to me to be a strong correlation between a person's drive to learn something and their willingness to pursue a formal education... not surprising if you think about it.
I also know an absolute genius programmer who is 99% self-taught. But just because people like Wozniak exist doesn't mean they're the norm.
In regards to the SaaS class: I know a bunch of people who took it before it was offered online. Perhaps surprisingly, most of them did not find it useful. The issue is that they picked up everything taught there either on their own or in internships; they really didn't need to waste a whole course on it. That said, the particular people I talked to are some of the better EECS majors who tend to have significant projects of their own and good internships, so there is certainly some bias.
I once worked with a brilliant programmer who was studying Classics and English Literature and he had an entirely novel approach too, and brought real value to the team.
That's the cool thing about programming -- it's an abstract thinking skill, so anybody with any sort of formal training will bring their specific ways of working and thinking into the game.
If you stumble upon a problem that cries for a trie or a splay tree and you don't know they exist, you'll have a very difficult time solving the problem with adequate performance.
If you are lucky and dedicated and talented you might end up with something similar, but it'll take you a lot longer than one who already knew they were there and how and why to use them. Likewise, if you have been trained in developing algorithms, you know what are the important things and which aren't, and have a toolkit to select ideas from.
Of course, outliers do not invalidate the thesis.
And how often in your experience you stumble upon these kind of problems? In my experience, the clever parts are about 5% to 20%. Of course, there can be projects where the clever parts outnumber the non-clever parts, but we are talking about norms, and as you said, exceptions don't prove rules.
Caveat: These problems might not happen often in less data intensive domains but, when they do happen, they are certainly very important in my experience.
And the question arose from the claim that the formally taught and self-taught programmers take different approaches in general. It goes without saying that a problem that can be solved effectively using a trie will be approached in 2 different ways by someone who knows tries and someone who does not. The claim made in the OP was broad, and I am saying about 80% of the time, an auto-didact and a CS person will solve it the same way. Claiming that because sometimes a CS person can use insights which the non-cs guy doesn't have doesn't equate to different approaches.
It's possible to get the same end result most of the time (especially if the end result doesn't require the "clever" solution), but I would also agree that there definitely is a difference in approach that is discernable by watching someone work.
Starter finisher bug fixer architect
In many ways I think these are the sorts of things that are influenced by your background. People with a CS background tend to be better at the architecting side of things in my experience. The self taught are better starters because they are super comfortable learning new languages and enjoy the thrill of the new stuff. Some of the best finishers I've ever met tend to be EE folks.
I think this is possibly as much about their background as it is about the personality types that choose these different paths. That said, lets look at the coding style. The EEs I've worked with have all written extremely "simple" (This is not derogatory) code that was easy to verify and tended to not use as many "high level" features. The self taught programmers I've worked with write amazing code using some cutting edge shit that looks great and usually works great... but often don't think about optimization until the very end.. some times to the detriment of architecture and design. The CS folks will tend towards over optimizing up front and getting caught in the pre-optimization trap. They may over design it up front and tend towards some middle ground between "simple" and "cutting edge" that half the time ends up being worse than either of the other methods.
This is of course an over simplification and doesn't fully capture all of the differences I might've noticed.. it's simply an example and obviously I understand these are generalizations that won't always be true, but it's clear there are differences.
Additional example, if you want to know what a bunch of different grad students specialize in stick them together on a moderately complex project and just watch which items each person obsesses about. Some will obsess about network latency, some may obsess about the cache performance, others about security. We need all of these people... but it's clear they will hone in on different items.
That's been my experience as well, but I think it's mostly because of the three types, EE's are the only ones used to making schedules and sticking to them.
#2 "Of all the mathematical sciences, computer science is unquestionably the dullest. If I had my time again, despite discovering just how much I love writing software, I still wouldn't study computer science."
I stopped reading after this point. Why does he state as a matter-of-fact that computer science is unquestionably the dullest? It's actually quite captivating and quite profound. Cryptography, machine learning, computability theory - all leading ultimately to the question of what, exactly, is knowledge and what can we know.
I can't stand the broader attitude of this, which essentially boils down to "I'm a hotshot programmer therefore anything academic or computer-sciencey is stupid". A lot of people in general could be a little more humble and recognize the fact there's a lot of things that they don't know they don't know.
1. Computer science doesn't teach programming (with the corollary that computer scientists specifically don't want to teach programming).
2. Most people going into computer science want to learn programming.
3. Many people get fed up with the rigors of computer science (because they recognize it isn't teaching them programming) and move on to other pastures instead.
I've always believed that there should be a "Software Engineering" curriculum in the engineering department and a "Computer Science" curriculum in the math department. That we blur the lines hurts both fields, as programming students demand more programming in CS, at the expense of the underlying theory; and math students demand more theory, at the expense of being able to actually code up a solution.
At the end of it all, though, there is a strong value for some computer science in all programmers. It is amazing how often solutions get re-invented, though it happens far less now with the combination of open source and Google.
Software Engineering is better off if it's treated as a trade like being an electrician or a carpenter (which it largely is through on the job, experiential training being as emphasized as it is). Take what you absolutely need from the theory, and learn from those in the know to become a respected practitioner.
Software engineering is a trade without a guild.
I agree
I'm glad I did computer science. Even though my title now is Software Engineer, I learned most software engineering best practices on the job. What's very difficult to learn on the job is computational complexity theory, advanced data structures and algorithms, or simply a solid background in discrete math. Basically, you probably won't find yourself contributing hard, cognitively challenging problems in computation with a "software engineering" degree. In hindsight, if I had done some kind of "software engineering" program, I really would have sold myself short.
Exactly. Programming is not harder to learn or master than something like carpentry (i.e. something easily picked up by an interested person on their own, but with lots of potential for mastery).
What on earth would you be doing for four years of college studying programming sans compsci? What a waste.
Any engineering field is a collection of best practices, so that works out well.
I'm also 99% sure that the two degrees are also common at quite a number, if not the majority of big technical universities in Canada.
Back in the day I choose Software Engineering because the other (CS) seemed extremely theoretical to me. But I think that having that "blur line" of yours (ref to SoftwareMaven), let's you mix both worlds a little more, so I would prefer that. But maybe it's just because we always want what we don't have ;)
In Waterloo's case, the whole "knowing CS, but not how to program" falls flat, since we have an amazing co-op program where you can easily 2 year-ish of experience at different companies by the time you graduate, so most CS students that come out, do come out of the CS with Co-op, and as a result are great programmers.
This bugs me. There really should be another word for this, since, as far as I am concerned, something in which the scientific method plays such a secondary role should not be primarily classified as a science. I guess you could call it "a math", but that is not terribly satisfying.
This complaint is really just a rephrasing of the old "is mathematics science" debate (http://en.wikipedia.org/wiki/Mathematics#Mathematics_as_scie...), but as long as we are talking about if things that are "too engineery" are computer science, we might as well talk about if computer science is science.
The was another course, CS Software Engineering, or "programming" for the rest of us. They did our programming stuff, and then some. The two courses sort of forked. Programmers did more programming, we did electronics, hardware etc.
Funny thing was, the CS students became better programmers than the CS-SE people did. I think it was because they understood computers, and not just programming. Next odd thing was that the CS guys often become programmers, and the CS-SE guys ended up in support roles. Even when the CS-SE guy were programmers, they worked in herd like environments, where as the CS programmers ended up on some very interesting projects, like avionics.
Later on, when I did some support roles, I found that the programmers knew less about computers than secretaries. Web designers/coders were worse.
Not saying this is any sort of trend, and I did do my degree 15 odd years ago. But I found it interesting.
If they had more relaxed A-level grades for the CS-SE students (or it was under-subscribed and filled through clearing) then the students on the course were just a lower standard of student rather than the course itself being deficient.
I built a basic CPU, but i'd class that as digital electronics. Building a a very simple CPU isn't really that hard either.
<plug> Which is why I'm writing http://experthuman.com/computation-book. </plug>
People who majored in informatics would study such things as information theory, approaches to AI/machine learning, models of human cognition, communications (as in signal/noise, data compression, etc.), and so on, and would undoubtedly be required to take programming classes, where programming would be considered a tool to help people learn informatics.
People who majored in programming (wherever that was done, including industrial training and apprenticeships), would be required to take some informatics classes, where informatics was treated as a tool to help them learn to be better programmers.
Just changing the name to informatics would go a long way, in my opinion, toward clearing up the mess. Employers who demand CS degrees as if the degree meant "better-trained programmer" might think differently if they were called informatics degrees and stand in contrast to programming degrees (or certifications) that emphasized practical industrial software dev. And informatics departments would be freed up to be a more general resource to more than just programmers.
You could argue that mathematics is philosophy done right: With rigour.
I think people are just apt to become discouraged. There is the prevailing idea that only CS students can learn CS, especially on places like HN, which causes people, who would otherwise be more than capable, to shy away from studying the topic.
at my cs pgm, the assistant professors were supposed to make a presentation on day 1 so the grad students could make an informed decision which prof to work with, which subjects to sign up for.
the software engg prof was a glib, entreprenurial hotshot who said "my students have been placed at netscape, sun, microsoft, oracle". he talked about industry partnerships, internships, 1000s of lines of production code, maintenance, unit tests, refactoring...
the db prof said "i have personally placed all my students in oracle". he talked about rdbms, schemas, superkeys, boyce codd normal forms, how "everything was ultimately data, so you'll never be jobless if you became a dba".
the algorithms prof was a shy lanky dude who went straight to the blackboard and wrote "computers are to computing what telescopes are to astronomy". at that point none of us knew who dijkstra was, so we just looked at each other like "huh?". he then turned to us and said "99% of cs is about searching and sorting. sort algorithms. search algorithms." then he drew a table which listed performance of quicksort, shellsort, heapsort, insertion sort, and two algorithms of his own invention. he talked about Big O notation, theorems, discrete math, taocp. our heads were spinning, and when he left there was a huge collective sigh of relief.
at the end, the student breakup was like 49-49-2. So only 2% of the class signed up for algos. Like most indians, I come from a poor household & my main concern was coin. So I signed up for Software engg. After 1 month, I dropped the course and went crawling back on my knees to the Algo prof, and begged him to take me on. That single decision changed my whole life. In that 1 month, I had found out something about myself - that I was a royal prick. I was personally not cut out to do scut work.I had zero interest and respect for maintenance, unit tests, requirements & specs, UML modelling, refactoring, waterfall method, agile, kanban...I found that whole discipline filled with unproven subjective airheaded garbage, essentially a fad. To this day when a recruiter mentions the word "unit tests" on the phone, I just hang up. Just pure instinctual reflex.
It takes all kinds...
1) The problems math makes for you. These are the kind of problems lots of people think they work on, but don't. Compared to other problems, there aren't a lot of them, but solving one has a huge impact on the field as one solution can be shared across the industry.
2) The problems physics makes for you. These are the problems you encounter when you take the math and start applying it to actual machines. This is hardware design or software to directly make that hardware do what you want. This is 'applied' computer science and again, many can leverage the work of a few.
3) The problems other software engineers make for you. This is what most computer scientists/engineers/programmers actually have to do. This is dealing with making someone else's code do what you want. It's dealing with API's and layers and layers of other, primarily human-created, problems.
This confirms the 0.1% rule of the op.
The world in which this is "scut work" is not the world I want to live in.
Let's be honest. You don't want to do practical, you'd rather do theoretical, and that's fine. However, don't disrespect practical just because it isn't your bag of chips, particularly to an audience that is full of practical engineers. I could spend all day disrespecting theoretical -- mainly because most of those passionate about theoretical at the expense of practical make comments like these -- but I do not, because I see theoretical as necessary for our craft.
As an example, take Google's self-driving cars. Would you say the meat of their body of work theoretical? But would say the code they (Sebastian Thrun himself, and others involved in the project) write code that's not very practical, readable, maintainable or without tests? I would say what they do is theoretical work. And they write practical code for their theoretical work.
If you look at Udacity classes - I've watched Peter Norvig not Thrun's so I'll use that as a reference - Norvig places a lot of importance for tests, maintainability, readability and other practical things throughout his class. I would assume the code he writes (however little now, however much in the past) is very practical. Yet what he writes code for has a huge theoretical aspect to it. I'm saying one can have their body of work being theoretical by nature but that doesn't mean they don't write practical code.
"Nothing I have ever done is of the slightest practical use." - G.H.Hardy
No.
The estimate they gave me of the contribution of their control algorithms (the "theoretical" part of the project) to the over amount of effort getting the thing working was less than 1%.
Just because nobody has built a self-driving car before does not automatically make actually building one a theoretical exercise. The process is applying the sciences to making a car do something, which is very practical. Your awesome sort algorithm and the paper explaining it is theoretical. My implementation of it is practical.
That is the differentiation that most people can't see.
Software engineering 'ideas' regarding modeling and testing have gone way overboard.
I have a feeling that that all those who peddle fancy buzzwords such as agile and kanban are either MBA graduates with no real engineering background or failed engineers trying to reinvent their career.
In my experience the ones who know the most theory are also often the most pragmatic and professional ones. These don't boost about their technical knowledge, but they know it and know how to apply it. These will declare themselves 'problem solving'.
One that declares himself mostly theoretical most likely just hasn't gotten that far yet. Then we have real researchers, but that's another story entirely.
"I think that it's extraordinarily important that we in computer science keep fun in computing. When it started out, it was an awful lot of fun. Of course, the paying customers got shafted every now and then, and after a while we began to take their complaints seriously. We began to feel as if we really were responsible for the successful, error-free perfect use of these machines. I don't think we are. I think we're responsible for stretching them, setting them off in new directions, and keeping fun in the house. I hope the field of computer science never loses its sense of fun. Above all, I hope we don't become missionaries. Don't feel as if you're Bible salesmen. The world has too many of those already."
So said Alan Perlis, the first recepient of the ACM Turing award. I'll listen to Perlis all day than pay any attention to an Agile blowhard who calls himself a "thought leader" on his own biopage. customers can go fuck themselves. cs is what matters.
Fun for me means keeping the project on track, delivering so that we get an income and can spend real money on R&D and events. I don't want to sit in a project which hasn't delivered in months, is in overtime (with all rhe stress that that means) and no working program what so ever, just a bunch of Impls, Contexts, BidiMaps and XxxUtils. That's not cs, and it sure as hl ain't fun!
Oh, dear Lord. This comment makes me hurt.
Your salary from Bank of America comes from customers -- even if you're paid from investment, the investment is only there because Bank of America has customers. Your research in academia is paid for by customers of the institution, both former and present, and possibly governments (who are also interested in the product of the research). Your shortsighted world view is tragically common in those who favor academia, and without paying customers driving research into new areas, your precious academia wouldn't exist and you'd do well to understand that. Money is everything.
What the hell do you think the point of academia is? All throughout history, the sciences are almost always advanced due to a pressing need or mistake from practical execution.
> cs is what matters.
Execution is the only thing in the world that matters. You are basically admitting that you're the idea guy, searching for a "technical co-founder".
Had Mark Zuckerberg spent a lot of time worried about the runtime efficiency of parts of his code or whether there was a more efficient algorithm for sorting friends, Facebook would be nothing today. He executed and didn't give a shit, because he wasn't exercising computer science, he was exercising building a product.
Surely people went back and made things more efficient as Facebook scaled, but I've been at a rapidly-growing startup a while, and I haven't made my product more efficient through many computer science advances. Most have been using better software, better network topology, better configuration, less dumb code, and so on.
Your attitude completely misses what the article is explaining, and, frankly, your ad hominem on the guy talking about Agile is completely out of place when practically your entire LinkedIn profile is buzzwords, just your field instead of his.
(Aside: I love that HN makes it really easy to build a list of no-hires, fairly easily, just by observing how people think and communicate.)
Please stop. You're getting irony all over my desk here.
No. I will not silence my opinion because you disagree. Although your comment is almost devoid of insight, I would infer that you're implying I'm being obtuse regarding the role of computer science in making my stuff better. Example of a performance improvement: choosing a frobnicator that uses multiple cores to frobnicate instead of a single core to frobnicate. Do I have computer science to thank for that? In a way, the same way I have medical research to thank for Advil. However, it's disingenuous to say medical research got rid of my headache. The Advil did.
Computer science has its place, but it needs to be more aware of that place. This thread is a very poignant demonstration of that.
Maybe, but he also said specs and maintenance.
How would you know when to use a hashmap and when to use a list if you don't know anything about big-O notation?
Let's say you want a data structure that performs three operations. Insert, Delete, and Find (as in, 'is this in the database?'). The intuitive sense may come from saying, "Linked-Lists would be horrible for this! Each operation would be slow." (O(n)) The practiced programmer may say, "I can keep the data sorted and use an Array. Those would probably be faster." (O(lg n)) However, if you learned a little more CS and how hashes work, you would know that they are constant time for all three operations. You never had to waste time thinking about which choice to make because you know how hashes are implemented and that they specialize on those operations running in constant time.
Besides, big-O notation takes no time at all to learn. I learned it's theory as a freshman in high school during algebra II when we wanted to know which of two polynomials grew faster. Take the most significant part, rip off the constants, and that's its growth rate.
Well, it's an upper bound on its growth rate. And only after some possibly-gigantic n.
We also understood that it was as n -> infinity, hence why f(n) = 2x^4 would have a larger growth rate than g(n) = x^2 + 5000. When you're talking about scalability when programming, you're going to have to understand big-O, how constant factors come into play (why Floyd-Warshall at O(n^3) is often better in practice), and how big-\Theta works. If not, you're eventually going to make a mistake and slow everything down.
Really? I find it the most interesting. Which is, I think, what led me here.
I keeping seeing all these cs vs programming articles. I'm really waiting for a "fuck just programming, cs is fucking awesome" one, because all the ones I've read so far sound like "haha, stupid math nerds and their cs. just learn to program" (a bit of mis-characterization of this article, maybe, but I get annoyed when people say something I like is "unquestionably" dull)
Is my hipster showing?
I prefer computer-science because I don't like loading five windows and 18 tabs worth of incidental state into my working mind just to get any work done at all, but I greatly enjoy cutting away every impurity and irrelevant detail to forge a creative solution from the ore of a truly difficult problem.
Instead most people focus on how programming isn't CS enough, or how CS isn't real-world enough and they miss or gloss over the fundamental difference between the two in regard to the type of cognitive abilities required.
We have physics, but we also have mechanical and civil engineering. Likewise we should have a computer science major and a developer major. Just as how mechanical and civil engineers still take some physics and math courses, the developers will take some of the CS courses in addition to specialized courses for their major.
What I find is: almost nobody can program, and almost nobody knows basic CS 101 data structures.
It does not matter if you are a self-taught programmer with ten years of experience in the best companies, odds are that you cannot solve a trivial coding exercise.
It does not matter if you have a masters degree in Computer Science, odds are that you cannot successfully build a tree structure.
I have no idea how these people keep their jobs or how they graduated, but this is the norm. People who can do CS at all, and people who can code at all, are both rare. Or at least, are rare in the pool of people applying for work.
Real programming projects are best. I think one of the best methods would be to give a person a reasonable assignment that should only take a couple hours to complete (if that long) and ask for the results within a few days. (This will give them plenty of time to clean it up, add surprising features, and create a nice design and front-end after they are finished with it. A day can be used for the promise of completion, and the remaining time can be used to overdeliver.)
My point was that nobody else is talking about that. You just brought that up completely out of the blue, but in response to someone. When you reply to a post, those of us reading the thread tend to assume your post will in fact be in reply to the parent post, not a completely unrelated post just stating your opinion on something else entirely.
I hate that, to most folks who are into CS, CS is a yardstick for how much value a hacker will develop. "Can't optimize this from O(n^2) to O(n)? I have no idea how you keep your job." There is far more to the value produced by a hacker than the typical interview questions, and this elitist attitude out of most compsci folks is obnoxious.
This is why, even though I understand CS, grilling me on theoretical CS in your interview is automatic points off and I'll accept the position that actually quizzes on practical. I'm definitely of the mind now, being a self-taught programmer with a working knowledge of compsci, that I will learn things when they're needed to execute (not so they'll sit around in my brain waiting for the manager that Googled hard interview questions to ask).
Every programmer should be able to fizzbuzz. 95% can't. This is a problem. Every CS grad should be able to build a tree. 95% can't. These are serious problems.
I suspect that the only reason there is such a rift in the first place is because the sources of funding for people employed in CS and SE are different. CS is funded via (predominantly) government grants. SE, clearly, is typically funded privately.
Like China commenting on diplomatic rows between North and South Korea, I'll say: both sides need to learn how to work with each other.
It's a rare, rare high schooler that can learn how to use computer science. Most CS grads don't.
And we wonder sometimes why our software is so cruddy.
If you're the tech cofounder at a startup, you're probably focused on building a new product that customers love from scratch. You're going to need a very different set of skills and abilities than, say, Microsoft engineer #10000 who is maintaining some old codebase. Or even engineer #100 at Google who's trying to scale to hundreds of millions of people. Etc.
What's weird is that people hardly ever mention these differences. They just say things like, "All programmers should know advanced algorithms"... or data structures, or compilers, or UX design, etc. Even if people/companies don't say this explicitly, they say it implicitly when they quiz for specific material in interviews for jobs that don't rely on that type of material.
If you're exceptionally good at what you do, but you constantly hear that you're inadequate because you don't have this skill or that knowledge, it's easy to doubt yourself. But you shouldn't. The fact is there's nobody who knows all of this stuff, or even most of it. And there's no job that's going to ask you to do most of it (I say this as the sole tech person at a startup where I have to do sysadmin, back-end coding, front-end coding, and design single-handedly).
Just find what you love and get good at it.
Scientists: Focus on developing new theories, solutions to abstract problems, etc.
Engineers: Build tools based on the theories created by the scientists.
Developers: Build products based on the tools the engineers made.
Back to your original question, maths is an extremely useful tool both for CS research and development. A pure mathematician is providing material for all of CS to work. But CS people, programmers, and so on need to know some math too.
Engineers: study how to build. This may include original theorizing pertaining to methods of building -- they don't just ape scientists' theories, they create their own. Engineering is itself the science of building.
Developers: Engineer vs. developer is an arbitrary division. In truth there is a continuum from the most scientific of engineers, who use abstract theorizing to create new technologies, down to someone comparable to the person who installs your water heater.
We have a slightly weird structure: everybody takes the same intro courses but then you can do whichever advanced courses you like. So this means that everybody (even pure EE people) get programming courses going from Scheme (SICP) to assembly. (And the CS people like me also have to do a bunch of EE.) Then, most of the advanced CS courses all involve a healthy amount of programming. The only exception is the algorithms/theory sequence, but most people don't do all of it and everybody (except EEs) do some other programming courses as well.
I think the main difference is that the program I'm in is part of the engineering college of a school that takes engineering rather seriously.
But he comes dangerously close to the "computer science is math" notion that assumes CS is just theory. It is not. I wrote an entire blog post in response to this (surprisingly common) sentiment: http://www.scott-a-s.com/cs-is-not-math/
HN discussion: http://news.ycombinator.com/item?id=3928276
I don't think the difficulty barrier is the issue.
The issue is the code you write out of school. Your sense of style is driven by the fact that the TA would mark you off if you didn't write a comment before your function. Your experience working with other developers is confined to that one terrible semester long project with the one idiot and the other guy who wouldn't do anything until the week it was due.
I don't mind so much that I had to learn QuickSort every year for 6 years or so. I do mind that I left school not really grokking a thing about object oriented notation. I left school thinking objects were nice and they could have methods, and you could create other objects that got those objects for free - maybe some sort of polygon class with subclasses "square" and "triangle".
But in practical terms of course it was one huge main() function for most of the "hard" problems they had us solving.
I understand not wanting to be a "trade school". Computer science is harder than that. You want people who can understand big-O notation. But teach them how to code, even just a little bit.
As for my myself, I studied roughly 3 years of computer science before I dropped out to work full-time, so I only have a half-finished bachelors degree. I wont say I regret it, because the last 5-6 years of being partner in a startup and earning a good pay-check have been fun. But I very much do regret not being able to completely grasp all the new interesting research papers that are coming out. Nothing is more frustrating than reading a research paper, and knowing enough to be able to grasp that this algorithm could improve some part of your system, but then being unable to decipher/implement it, because one have forgotten(or not learned) parts of the mathematical notation/background. In other words being able to see the solution, but the solution being juuust out of your grasp. I hope down the road to be able to compensate for this problem by hiring smarter guys than myself that DID finish their CS degree :)
Also another benefit of studying CS is that around year 2-3 you will be introduced to some subject matter that I at least personally am pretty sure I would never have heard of otherwise. I found stuff like operations research and integer programming very interesting. I havent yet have had opportunity to use any of it in the "real world", but its nice knowing whats out there, who knows it might come in handy a few years down the road in some other venture.
Coming from theoretical math, I feel like the reason that computer science is dull that as a part of math, it is mind-bendingly difficult.
The almost no "substantial" theories of computer science because they would have extraordinarily encompassing abstract statements about what is possible to compute, essentially to even think about. P =? NP is a good example. Unlike other Millennium Math Problems, there has essentially been no positive progress on the question. The only theorems are about how this or that tool won't help us. And P=? NP is a simple, even "obvious" statement from the right standpoint.
Essentially, most of the generic theories of CS are constructions to show something either possible or impossible.
I'd wonder if you could teach CS as something like the ragged edge of mathematical logic. Might make it authentically interesting ... for a few people but it would probably wind-up being less practical. Sigh...
that's not computer science; that's software engineering "theory".
Algorithms; data structures; type systems; however ...
I disagree with this statement. My program at school supplements 6 months of formal learning with 6 month long internships. I don't feel like 4 days a week is enough to get the benefits of working to supplements formal learning. I defiantly need 6 months in a job to learn something valuable, and towards the end of my internships is where I feel like I've learned enough to contribute just as much as any of my teammates and coworkers can.
Seriously, I understand what the author is trying to convey, but IMHO he goes too far on the bias against CS. It is a serious handicap to program anything worthwhile and using APIs and frameworks without understanding (at least to some degree) what they do ... my .2 cents
I do not like these strange lines in the sand that are drawn between engineers and scientists. These distinctions are artificial and a curious mind shouldn't be trapped on one side or the other.
I thought it was interesting that the poster used these examples for CS.
I didn't take a single course at university that dealt with either of these topics. Everything I dealt with in comp sci was algorithms & complexity theory, coupled with a smattering of, "this is how computers actually work". Far as I can tell op is talking about computer programming subjects, and not computer science subjects.
A introductary (undergrad) computational mathematics course at my university covers; numerical solutions to PDEs, Inverse problems, Regularisation problems, numerical optimisation etc.
I'm not saying it's incorrect, but it just doesn't seem to fit well.
Architect a solution to a big problem: theory comes in very handy.
software engineering != computer science
Computer science is a lot more than proofs.
When you're writing a multi-million dollar piece of software (20+ man-years), the technical problems are the easy ones to solve. Actually putting the thing together is the hard part.
'you will discover that software engineering has accepted as its charter "How to program if you cannot.".'
http://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1036...
"Software engineering" has little to do with engineering and its principles and everything with applying buzzwords to squeeze the most money out of whomever was suckered into paying for the project.
I wrote a Quake 3 mod in C++ (directional damage modification, server/client magazine+reload, and a few other things not-so-difficult things) in high school around age 17. I then did a CS undergrad at a top 6 university.
I learned more about programming writing that mod than my combined experiences at school.
But it isn't just "studying man-made creations". It's about studying computation in general. Not just man-made machines that compute.
Mind you, information theory, which is often considered computer science, certainly applies to nature itself. Of course, it would be easy to claim that information theory isn't actually computer science. Personally, I consider most of computer science more math than science. In fact, I sometimes tell people I do math! (This is a great way to avoid further questions at borders or awkward parties.)
Saying that complexity theory studies "man-made things" is like saying that chemistry studies man-made molecules. It's technically true, but it confuses the methodology with the object of study: studying particular chemicals vs the underlying laws governing them or particular models vs the underlying laws of computation.
Paraphrasing from Sipser[1], the class of decidable and undecideable languages is the same for any "reasonable" model of computation where "reasonable" involves some basic things like not being able to do an infinite amount of work in a single step. So while any particular model (e.g. a Turing machine) is arbitrary, the class of languages is actually natural.
[1]: http://www-math.mit.edu/~sipser/book.html
This makes sense--any model of computation containing a countable number of instances will not be able to decide or even recognize every language. It also makes sense that these models would be able to recognize the same set of languages.
I think this also holds for complexity classes. That is, the complexity of a language in a class like P or NP is the same across different models as long as those models are all deterministic or non-deterministic.
So really, complexity theory is not about a man-made thing: it's about a deeper, fundamental truth. It's really awesome.
This is an absolutely bogus comparison. Music does not need to be maintained, music does not need to be troubleshooted or debugged (and thus, reasoned about), music does not solve a problem(1).
Music is an artistic expression, while computer software isn't.
(1) Writing soundtracks for movies, for example, can be considered solving a problem with music. It also requires music theory knowledge because soundtracks have to convey particular emotions at particular moments.
I used to compose music solely by playing around on an instrument until I hit upon something that sounded good, but I had no idea why it sounded good.
I can still compose that way, but after studying music theory, I can compose directly from my head to a sheet of paper without any instrument, as (1) I can now envision in my mind what the music would sound like, and (2) I understand and can employ reusable patterns and concepts of composition that I know will sound good and work together.
Similarly, when I started programming, I had little overall vision for what I was doing. I just started writing code, and stopped when I had built up a pile of spaghetti statements that did what I wanted them to do. Now, with better understanding of design concepts and reusable patterns, the development process is much more clean and structured rather than poking around with guesswork.
You can have clashing chord progressions which are "good enough to ship", but to a keen listener might throw the whole performance away. It's not a perfect analogy (none of them ever are) but it might be more apt than you think.
This is an absolutely bogus comparison
I disagree. There are very successful songwriters and performers who have no training, but almost all of the good songwriters and performers did have (usually classical) musical training.
The same is absolutely true in software: There's a lot of very popular crap out there, but the software which is universally recognized as good -- code like TeX -- almost always comes from authors with solid computer science training.
Unless it is? The sentiment that the pursuit has to be entirely about doing a job or providing utility is frighteningly inhuman. I need to go for a walk after reading that. Or maybe watch some demoscene.
We could dubiously cast an eye to instrumental music vs. singing. After all, the former can only be expressed indirectly via a contraption.