You make some good points, Frans, but I sense a hint of assumption in some
of your statements.
well, it doesn't guarantee anything, like NOT having a degree also
doesn't guarantee you anything. What it DOES guarantee you is that IF
you make it to the end of a CS course, you have studied a lot of the
different areas which form CS and have specialized in some of them.
Above that, you have learned how to learn things and what software
engineering is all about: (hint: it's not about typing in code).
The assumption here is that the student has thoroughly comprehended the
course. That is not something which can be taken for granted. In fact,
having a degree guarantees nothing. What a student gets out of a course is
largely dependent upon the student. In other words, you are not taking
enough credit for yourself here, attributing the benefit you received from
your course of study to the course itself, rather than your own diligence in
taking advantage of what the course had to offer. At best, it gurantees that
the student has been given ample opportunity to avail him/herself of the
information presented.
The factors which affect whether or not a student passes a course and
receives a degree are many. Some people are good at taking tests. Some
teachers are easy graders, or succumb to some political pressure to pass
more students. Some people have a great capacity to retain information; some
do not. There are good teachers and bad teachers, and we can certainly
expect that there are as many hacks in the teaching profession as in any
other. It is important to remember that in every individual aspect, half of
the people in the world are below average.
Note also what I am *not* saying. I'm not saying that taking a course and/or
receiving a degree is a bad thing, or that no benefit is derived from it.
What I am saying is that the benefit received is likely to differ greatly in
kind and quality from one person to another, and that very little can be
guaranteed as a result.
CS as a science has been, how can I put it nicely, with self-proclaimed
'specialists' who don't have any degree in CS but claim to be a 'senior
software engineer' or other well educated person with a lot of
top-knowledge. If we project that situation on medical science (and why
not, it's also a science!) you easily see how silly the CS situation is
at the moment.
You won't be allowed to practise medicine when you read
4 books from Wrox and have a little experience in the field, though you
are fully entitled to write software for medical systems for example. I
find that a little disturbing.
Comparing CS to medical science in terms of who is qualified to practice it
is a bit of a stretch. In places, the analogy holds fairly well; it others,
it becomes ridiculous. A medical practitioner is occasionally solely
responsible for the life or death of an individual, for example. This is
hardly something which can be said of a programmer. Surely, the requirements
must differ. However, in some respects, there is a great deal of similarity.
For example, a medical student does not practice medicine without
supervision when he/she graduates from medical school, as there is no
guarantee that the schooling has made a competent practicioner of him/her.
It is experience, combined with study, which determines that.
In addition, as in programming, there are diverse types of medical
occupations, some of which require more education and/or certification than
others.
Finally, medicine as a science has been in existence for thousands of years,
while computer science has been a science for a matter of decades. IOW,
computer science is in its infancy. When medical science was in its infancy,
the requirements for a person to practice medicine were about as stringent
as the requirements for programmers today.
Don't ever forget Albert Einstein.
Not for the value of a title like B.sc.
in CS, but for the acceptance of CS as a true science which requires
knowledge AND wisdom from the people doing things in the fields of that
science.
I'm not sure what benefit may be derived from "the acceptance of CS as a
true science."
Software engineering isn't as easy as tic tac toe like it isn't easy
to do brainsurgery. It might look like it is, but it isn't. If it was
as easy as tic tac toe, we wouldn't have things like bugs and design
flaws.
We have things like bugs and design flaws for the same reason that medicine
has medical malpractice suits. As long as humans are involved in the
process, so will errors result from the process. This argument does not
strengthen a position advocating the acquisition of a CS degree.
The chances are HIGHER that you will write software which is of a
higher quality, because you have studied the research results(!) of
studies how to improve the process of software engineering.
The chances are higher that any individual who applies for a job is
qualified for the job. This is useful for the interviewer, not for the
interviewee. As for whether a CS degree increases the chances of the
individual seeking one, that is mostly up to the individual.
And, while it is certainly true that a CS degree may indicate an increased
probability that an individual is more qualified for a job, that statement
does not logically imply that a CS degree is the sole measure of competency,
nor that it is the most important qualification, or that it is very
important at all. For example, if I were to play the lottery, I would double
my chances of winning if I bought 2 lottery tickets instead of 1. However,
if the odds are 7 million to one, I have now increased my chances by a
statistically insignificant amount.
IOW, the question here is not whether a CS degree is a good thing. The
question here should be, what are the factors which are most likely to
influence the ability of the individual in the programming field, and which
factors are the most important, and therefore should be given special
consideration?
So far, the arguments presented have not indicated any relative merit of
having a CS degree compared to any other factor which may influence the
outcome. Everything is relative. When I was a kid, I had jobs which paid
$1.50/ hour. As time went by, the U.S. government gradually raised the
minimum wage, and my salary in dollars increased. But my relative income did
not. As long as I made minimum wage, my actual wealth never changed,
regardless of the dollar amount. Similarly, the value of a CS degree cannot
be determined in a vacuum. It must be compared with the other factors which
increase or decrease the likelihood of the individual to prosper as a
programmer. Only then can it be said to have any meaningful value
whatsoever.
Want an example? On my bookshelve I have a book, Algorithms in C by
Sedgewick. It contains a myriad of nice algorithms, most of them are
pretty old, think 70-ies. We had to study the algorithms in the book
during an algorithm course at the uni. It's not that I know all the
algorithms in the book in detail, not at all. What I do know is that
algorithms are one of the cornerstones of software quality, and that
there are a lot of documented algorithms out there ready for you to
use. People with a degree LIKELY (but it's not guaranteed, nothing is
guaranteed in life except the end of it) have studied some of the well
known algorithms, why they work, how they work and know that there's a
ton of research results out there ready to be used. So these people
often dig into these results, refresh their memory and apply them in
their modern software. Yes, that's perfectly possible, because CS isn't
about C# or Java or other time-bound element.
Again, here is an argument for which you attribute your own virtue to the
value of having a CS degree. The fact that you have kept these books, that
you have studied them, and that you make use of them, are all attributes of
your own virtue.
A person without a degree LIKELY (but it's not guaranteed) hasn't
studied these algorithms and starts from scratch, and along the way
picks up a trick here and there, but never gets to the point where the
deep theory behind all the algorithms is learned, simply because that
takes reading a book about that theory, and when will that happen?
This is making a lot of assumptions. While the benefit of getting a CS
degree are quantifiable, I am not aware of any similar statistics regarding
the practices and/or professional and educational history of individuals who
have *not* obtained such degrees. As an example, I can tell you that this
certainly does not apply to myself. I have about 30 or so books on
programming currently on my shelf, comprising a wide range of topics,
including advanced math and computer science. This hardly accounts for all
the books I have owned; I periodically throw away ones I no longer need. I
read for at least 2 hours a day. And when I am not working, I *think* about
programming, math, and science, as well as philosophy. How many people
holding CS degrees can say the same? Of course, my individual experience
does not disprove your assertion, but it certainly proves that your
assertion is not at all certain.
The answer is to sort the graph as a directed graph using topological
sorting of a directed graph. It's 20, 30 lines of code. However if
you've never studied graph theory, you will never think of solving it
that way. ....
People who don't study that theory will never get that theory through
other ways because they never study the theory on its own, also
applications of the theory in practise.
The implication here is that if you have not taken a course in CS, you have
not studied graph theory. No need to comment on that assumption. In
addition, the idea that people who haven't studied the theory will never get
it through other ways is disproved by the fact that those who developed the
theory in the first place necessarily got it through other ways.
In other words, one doesn't have to read about gravity to know it exists,
and be familiar with how it behaves. Mathematics is a discipline which seeks
to discover things which *already exist* without anyone even having to be
aware of them, as is science in general.
This thus means that IF you want to be able to
apply the theory, you also have to understand that you will only be
able to do so if you study the theory, not the application of the
theory in practise.
Again, there is no implication in this statement that taking a CS class, or
getting a degree in CS is the only or the best way to learn about such
things.
I disagree. No matter what you do in practise, you will never learn
the real theory behind what you're doing if you don't study the theory
on its own. It MIGHT BE (but it's not guaranteed) that by doing solely
practical work, you pick up a trick here and there and be able to
create working software for a lot of situations, but if the focus
changes of the tools you're working with, will you still be able to
perform on the level you were working on right before the focus change?
I doubt it.
The implication here is that there are 2 possible alternatives: Taking a
course in CS, or "doing solely practical work." In fact, the opening
statement of the paragraph is correct, but the conclusion is not.
I told him that it doesn't matter which
language you pick, because programming isn't about a language, it's
about writing algorithms in an executable form, using a translation to
a language, which can be any language. The chosen language is just the
tool to teach programming, it's not about teachning the language.
He didn't understand what I meant. :/
Perhaps you didn't understand what *he* meant. A programming language is an
interface. Some interfaces are better than others. And one can learn about
the principles of programming better from languages which have a "syntax
interface" which intuitively appears to be more like what it represents.
Therefore, the conclusion that "it doesn't matter which language you pick"
is far from certain.
Note that I have *not* stated that it *does* matter what language you
choose. I have merely stated that you have not proven that idea, and that
there are strong arguments which can be made to refute the idea.
In fact, programming is *not* simply about "writing algorithms in an
executable form." It is largely comprised of logic. Logic is a discipline
which is very difficult to master, and must be practiced over many years.
While the principles of Logic can be taught, the application of it is a
discipline, which requires a lot of work in terms of changing one's habitual
ways of thinking. And that cannot be obtained from a university.
Why would a university spoil resources on the hype of the day? If
that's necessary, it would prove that Dijkstra was wrong: "CS has as
much to do with computers as Astronomy has to do with telescopes" (If I
quoted it correctly) and that everyone (like myself) who was on the
university when Unix and C were still great and OO was not common, can
throw away his/her title/diploma because they actually don't know
anything!
Albert Einstein was a genius, and moved theoretical physics forward
termendously. He was not God, however, and he certainly was wrong about a
few things. I'm sure the same can be said about Dijkstra, without
necessarily expecting to be stoned to death.
It's about the theory behind all that. C++ isn't important, OO is
important. For compiler theory, you probably can study the mechanics of
generics / templates and the like and use C++ as an example, but it's
not the other way around.
And I suppose that telescopes aren't important to astronomy? I'd like to see
how astronomers would formulate their theories without the data that they
collect from their telescopes. Again, we're looking at a flaw in your logic:
Premise: OO is important.
Premise: For compiler theory, you can ... study the mechanics of
generics/templates... and use C++ as an example, but it's not the other way
around.
Conclusion: C++ isn't important.
THAT's what's such a big misconception about going to a university to
study CS: it's not about learning Java which you can also learn from a
book yourself. it's about the theory behind it. It's about answering
the WHY questions popping up with everything you do related to CS, not
the HOW.
The "whys" of things are admittedly more important than the "hows" of
things. But the "whys" of things are in fact much more elusive than the
"hows" of things. It is easy to fall into the trap that because one has been
given a certain level of "whys" that one has achieved enlightenment. But
there are "whys" behind the "whys," and one must be wise to make that
discrimination. Issac Newton observed mathematical principles which could be
applied to things like motion and gravity. Using those mathematical
principles enables us to do things which we could never do before. But
Newton only discoverd a certain level of principles. Even today, theoretical
physicists are struggling with the "whys" *behind* those principles. We know
that gravity exists. We know how it behaves. We have mathematics which can
predict its effects. But we still do not know *why* it has the effects that
it does. In its day, Newtonian physics was considered to be the "whys" of
physical behavior. But we know better now. It is still used for its benefit
as a "how" of physical behavior. It is useful. But it is not causal.
Similarly, OOP is a level of theory about computer science which represents
a point in the development of computer science while still in its infancy.
Why does OOP exist? What are the principles behind it? What greater power
might we obtain by such knowledge? In the long run, it may turn out that OOP
is an over-simplification of the principles from which it was created. In
fact, OOP is *not* a "why" at all, but a lower-level "how" than what came
before.
The point I'm making here is that what can be taught in schools, and
achieved through the acquisition of a degree or diploma is of highly-limited
benefit, in and of itself. I never went to school for computer science. It
wasn't until my 40s that I realized that the chief reason I did not do so,
and should not have done so, is that my individual strength is in teaching
myself, studying for myself, and that I always learn more and perform better
when I do. And the only point that I am making by this illustration is that
what is useful to some is not useful for all. The world is much more
complex, and not nearly so easy to categorize as we would like to think.
In conclusion, it isn't necessary for us to argue that one point of view is
correct, and therefore, a differing point of view is incorrect. Differing
points of view are not necessarily exclusive. Is there merit in going to
school and obtaining certifications and/or degrees? For many, the answer is
yes. For many, the answer is no. Therefore, for all, the answer is no. On
the other hand, does the second negative imply that going to schools and
obtaining certifications is unnecessary? It does not. Again, the answer is,
for some, yes. For some, no.
One thing is certain: We have a lazy nature. We are always striving to make
things easier for ourselves, inventing "labor-saving" technologies, etc. But
none of these efforts are of any avail. Things never really get any easier.
We still have to work, to strive, even if our striving is only to make
things easier for ourselves. This also applies to our thinking. We are
always hoping for "the" answer to a question, or the simplest solution to a
problem. But in fact, these things do not exist. At best, we may find the
*more* simple solution to a problem or *the best* answer available within
present limits.
My effort here is to simply point out that the question posed is not one
which can be answered, but only debated, and that, in such matters, the fact
that I am aware of a certain truth about something does not necessarily
contradict the assertion of someone else who may be aware of a different
truth about something. Logic is a two-edged sword, and one must be careful
about using it in a battle of the minds. There are certainly things which
are true, and things which are false, but they are often not the things we
think they are. We are all aware of something, and we are certain of that
which we are aware of, but knowing what it *is* that we are aware of is much
more elusive.
--
HTH,
Kevin Spencer
Microsoft MVP
Professional Numbskull
Show me your certification without works,
and I'll show my certification
*by* my works.