Self-Taught Developers: Are You Missing Your Foundation?
javacodegeeks.com
javacodegeeks.com
I'd say the true foundation needed is entirely different. Avoiding spaghetti code, good refactoring practices, understanding when more architecture is needed, avoiding premature optimization or over-architecture, concepts like technical debt, writing code designed to be readable, how to establish practices and standards and make sure they're communicated properly... These are the kinds of things that actually matter in most projects.
(Obviously, if you're writing video codecs or kernel code, it's a whole different story...)
Now, it's pretty obvious when we're discussing something as simple as this, but this is the fundamental essence of Big O. Certainly, we don't need to calculate it on a daily basis, especially past the general case, but it also doesn't hurt to have common terminology when speaking about an edge case of an algorithm.
And just having a general feel of a graph of how quickly an O(n^2) algorithm can spiral out of control versus an O(log n) algorithm is useful. (That is, if you have a small amount of elements, it's not going to matter, but it will matter quickly as the number of elements grow.)
For both PHP and JS, there really isn't a difference; you're just given some basic data structures that handle pretty much everything under the sun, and you go from there. You can have an array with numeric keys (list), or you can have an array with string keys (dictionary), and it's only in your implementation that will determine if you use it as an iterative structure or as a kind of hash-lookup structure.
While PHP does have some advanced data structures provided by SPL, and some JS implementations offer typed arrays and such, they're rarely used in the wild for various reasons. I think the main reason, though, is probably that they're not really needed for 99.9% of web apps.
If I were to rephrase, I would say, application developers aren't full stack developers.
Modern languages and frameworks hide a lot of complexity, allowing application developers to focus on business problems, which is a good thing.
But if you want to continue to grow as a programmer, and understand the tools you use, or use them to maximum efficiency, understanding things like Big-O analysis are crucial.
I don't often do complex "math" or analysis using Big-O... but understanding the core tenants are crucial, especially as you move from building apps to building frameworks themselves.
This only works because the size of your n is small, possibly a few hundred, so it doesn't matter. When you start dealing with millions or billions of records this stuff matters. Quite a lot.
So really, it's not the language, it's the size of your data - or the size of n that matters.
Especially given single-page apps, you should never be dealing with millions of objects; with pagination and such, it's usually under a 1000 at a time, more typically 100 or so.
I will say that I have never personally had to concern myself with a sorting algorithm (though I can definitely think of areas where one would), but pretty much everything else I have learned about algorithms has been extremely useful both as "tools for thinking about problems" and actually making correct and practical choices.
Sorting algorithms are taught because they are such a fundamental operation AND they provide some good "easy" examples for how different approaches can give you dramatically different performance. Some lessons can only be learned by actually seeing it for yourself.
I get the feeling from your post that you get this though. Because at some point you have to transcend your knowledge of Big-O, pattern languages, and go through those stages of being an Architecture Astronaut, second-syndrome, failing, failing better, and then maybe even succeeding in what you do.
Then things begin to get interesting.
It just takes less time when you can explain something using common terms, rather than starting with what complexity is.
However most unreasonable cases are much less subtle than that - I run into "filter in the database, not in the app" more often than more complicated issues.
I feel like self taught developers who are serious just learn this by intuition because, frankly, if you're writing software where it matters then very quickly it becomes an obvious concern. If your self taught and it doesn't matter then it doesn't matter!
With a formal background you may or may not use it, but I'd say the only difference is knowing the formal notation makes talking about it with other programmers who also know that notation easier, but even then it's not like algorithmic complexity is (at it's heart) at particularly difficult concept when directly applied to a project. I always found it much harder as an abstract idea rather than when working with a specific algorithm.
If you have a good idea of how things scale, being able to express exactly how they scale with succinct and clear notation is useful. Quite useful in fact.
That's why formal notation exists, because it is handy. Not because there is an eternal, global conspiracy among academics to keep up useless habits just to show off.
Avoiding spaghetti code, good refactoring practices, understanding when more architecture is needed -- all that stuff involves knowledge a lot less than wisdom. Sure, you can teach someone the basic principles, but until they've been bitten by some of the problems those principles try to solve, they won't truly know how to apply them.
The same can be said for algorithms and data structures: until you actually find yourself in a situation where you need finger trees because no other data structure fits your usage, you won't really know why finger trees are necessary and when to apply them. But the rules are a lot more clear-cut than when it comes to best practices.
Bottom line: both "computer sciencey stuff" (e.g. algorithms and data structures) and "best practices" (e.g. writing readable code and understanding when you need more architecture) can be learned and both require a degree of "wisdom" to apply, but the latter is a lot less clear-cut and has a lot more "maybes" in it.
Oh, and writing web stuff is not the only kind of work outside video codecs or kernel code. You could also be processing huge amounts of data, writing your own programming language or developing a game, for example.
Also - I use the computer science conceptual framework every day. I lacked it - and badly - when I was a self-taught teenager soaking up as much online as I could.
That is frightening. I can't think of any function I write without taking a second to think about what the Big-O would be.
And I don't even know how I could do things like parse input without knowing how to structure it so that look-ups never take more than log N time. And I don't know how I could do that without knowing sorting algorithms intimately.
And I am not writing codecs or kernel code, mostly it has been high performance and some soft real time, but I've also worked in back end web development.
Everything in your second paragraph I fully endorse, but your first paragraph is terrifying. I'm terrified I'll run into someone like you some day, clearly smart, clearly experienced and without a clue as to why I'm concerned about the Big-O of his implementation of something.
Except that's not what he said. He clearly does have a clue, he just hasn't actually needed it. And for application development, where most of the work is wiring together libraries, that's sounds about right.
Everyone writing code for a living has internalized when to use a map vs a vector. If that is the bar for "fundamental", then this whole discussion is pointless.
People have to get rid of their big hard on for Big-O, a useful concept that takes a couple hours to learn. It isn't a difficult thing that only the true macho programmers can know. I'd wish it was traditionally in starting programming books in the 'optimization & profiling' chapter and we wouldn't be having big fights about it.
If you are working on data analysis, than Big-O type basics become more important.
The point of having 'foundations', is that when you go to do almost a type of problem that you normally do not, such as CPU intensive data crunching, you know where to look for the information.
To be honest, I've found that my degree carrying co-workers fall way short in the basics. Perhaps it's just me, but my background in languages went something like this: GW-BASIC -> QBASIC -> ASM -> C -> C++ -> PHP -> JS --> Python -> Erlang -> Ruby -> C# -> Clojure. So for me, programming in C meant that I had to understand linked lists and sort algorithms.
I've sat in in interviews before and asked candidates (with degrees and experience) the difference between a dictionary, a hash-set and a list, and I just get blank stares.
So no, I think it's more about the desire to learn. If you have a true interest in Software Engineering, you'll teach these basics to yourself. If not, then not even college will help you.
I think most folks who truly master this stuff are self-taught, whether they went to University or not. I got all the degrees, but I can honestly say that I learned a lot more exploring on my own than I did sitting in class.
Books and lectures (from OCW etc) have been available for years now. These days you can go one step further by taking online courses with assignments, exams etc from Coursera. All you need is motivation, and self taught devs often have that in spades.
The real problem is that in most enterprise swshops/codebases, knowing (say) algorithmic complexity is not very valued in terms of reward structure (though it should be - I've fixed my share of O(k^n) horrors) and lots of people choose to go through life writing simple apps and stitching APIs together (which is perfectly ok as a career choice if that's what floats your boat).
(Due Disclosure: I worked as an enterprise dev for a decade before I shifted fields. I work on fairly large machine learning systems these days and let me assure you that knowing algorithmic complexity analysis - and other things like statistics and linear algebra - is a basic required skill in this world. Fwiw I am entirely self taught. My degree is in Industrial Engineering)
Certainly I am making up for a deficiency of math during my early years now. I always dismissed all category theory as useless but increasingly I realize how important statistics, category theory, and a solid understanding of how to analyze algorithms is. Even if you never prove the time complexity of an algorithm, being able to approach new literature and come out with new insights for your engineering efforts is invaluable.
Which is what any civil or mechanical engineer could have told you about their career, I guess.
I think that the main problem, especially for maintaining the student's motivation, is that a lot of the fundamentals don't seem to be all that useful to a programmer... until you finally understand them and it "clicks".
The more serious topics(set theory, algorithm design, and processor design) are almost entirely theoretical at the basic level, with very little information that can be directly applied to the real world. But once you start digging deeper, the usefulness becomes readily apparent.
Algorithms is an especially problematic topic, for a couple of reasons. The first is that the entire topic is built on top of a good foundation of discrete math, big-O, set and graph theory, and with a sprinkling of data structures on the side. So it's no a topic that you can just jump into immediately. There's a lot of background study needed before you can really start working on it.
The second is that to really understand an algorithm, you really need to be able to make(or understand) the proof of correctness and proof of efficiency. The goal of the student looking into algorithms shouldn't be just to get a laundry list of potential things to use(though they will get that as well), but to have the skills to be able to show that their algorithm will work correctly for all valid inputs, and that it's capable of doing so at a certain efficiency. That's the mindset of a good programmer, and it definitely comes with experience, but I think having the theoretical background helps a lot as well.
I think this is a fairly common experience.
Just read through the many comments here the gist of which is: Why would I care about the difference between a list and a hash table.
A lot of people tend to assume hostile bias against knowledge simply because they've been successful without it for a while.
> A lot of people tend to assume hostile bias against knowledge simply because they've been successful without it for a while.
I don't necessarily see it like that. My opinion is more along these lines:
> Why would I care TO STORE IN LONG TERM MEMORY the difference between a list and a hash table.
There are plenty of things I know I know, things I know I don't know and things I don't know I don't know. The vast majority of my programming knowledge resides in short-term memory; in six months ask me about Linked Lists vs Array Lists and I will have forgotten the primary differences (fast iterate vs fast insert or something like that)... I only vaguely know that today because I was researching something.
The biggest challenge I see as a self-taught developer is I see everything on equal footing. That means the basics (map, set, list) and the trivial (apache config settings, tomcat's web.xml) tend to reside in the same heap and if I don't think about one element for awhile it tends to get GC'ed. Since all of my knowledge came from 14 years of on-the-job-training nothing was given particular precedence, everything was important to the task at hand.
I believe that's really what frustrates self-taught developers. It isn't that I don't know the answer, or that I'm hostile to learning new things (far from it) it is simply that I never burned these fundamentals into my permament memory. I've tried, but I tend to miss bits and pieces, for example, I needed to refresh myself on autoboxing just a few weeks ago because I just haven't _thought_ about it.
Having and building this discipline is the single master skill that unlocks everything else.
As soon as we think we're done, arrived, or have a "foundation", we're dead. What we know today will be relevant in a different way tomorrow.
It's true there are intangible skills like design, usability and architecture, but it only comes from building lots of small and larger software projects, not in the classroom, textbooks, projects, or theories.
Algorithms are important, but I contest that the majority of web/mobile apps don't even come close to needing premature optimization.
I wouldn't think twice at hiring someone who's self-taught and self-directed over someone with a CS degree.
Why? Self-taught people seem to have more of a track record of things they've built, instead of school projects on a resume. Self-taught programmers also tend to like to build things customers like and focus on the customer a lot more instead of optimizing their own world and tools.
I would definitely argue that the only thing that gets in the way of my learning is my "education"
One handicap my CS education gave me until I realized it was the "start fresh" syndrome. In CS you start pretty much everything from scratch, and think that's normal. Get into the post-graduate world and scrapping existing codebases isn't exactly normal, nor is always starting from scratch.
- learning many technologies, even the ones I'll never use
- learning 100% of the syntax (10x what I'll ever need)
- being able to solve the same problem 5 different ways
- learning slick stuff I'll never need
- being able to scale to levels I'll never encounter
- winning brogrammer arguments in on-line forums
then, yes, I'm missing my foundation.If, OTOH, foundation means:
- seeking solutions for problems, not problems for solutions
- being able to learn whatever I need
- being able to solve most problems with few tools
- favoring action over status
- living in the real world, using academia as a resource
- having learned what really does and does not work
- having raving customers who don't care what's under the hood
- satisfying 100% of customers with 75% solutions
Then, yes, I think I'm just fine.What a shame. There are lots of very accomplished self-taught people who know much of this stuff and are busy changing the world. I sincerely hope you get a chance to meet many of them.
However, some self-taught people have conditioned themselves to hate CS due to constantly needing to prove to companies that they are qualified for a job despite not having a CS degree. These people place little value in understanding CS and because of that they are worse off because they weren't forced to learn it.
It all depends on what kind of person the developer is, and I am glad that you are the first kind. I'm getting tired of HN bashing any article that suggests that perhaps a developer doesn't know everything.
1. full understanding of computer architecture, realizing how the CPU executes code
2. analyze efficiency (Big O) (a few hours), knowledge of advanced algorithms
3. understanding compilers
4. knowledge of the OS workings (often self taught out of necessity)
5. AI fundamentals (Admittedly a specialized topic)In all honesty, I can't say I know for a fact that knowing these things made me a better developer. It's hard to quantify. In your day-to-day life you don't generally use such knowledge. It's entirely possible that it didn't make any difference to my actual work. I certainly did use it during job interviews and lunch-time conversations with my coworkers.
There is one way in which I feel handicapped compared to my colleagues, which is that I find it generally hard to grab a book on a programming topic and read it cover-to-cover (The same goes for taking classes). I've got to get a development environment up, see how I can break the 'examples', and generally abandon the book to doing my own thing before I get more than a third of the way through.
On the other hand, every time I've worked with more classically trained developers on real projects (and all the cruft that goes with it), I always find that there are corners of the code base that none of them understand, and no one ventures in to find out what's wrong.
Myself, I need to understand how a system works in order to work on it, so I always dig, and tweak here, or tweak there, and so I tend to learn full systems much quicker than my colleagues.
In the end, it's a trade-off, but it's how I work, so I guess I'm stuck with it.
Sure, for you, the cost/benefit scenario might not work out. You seem to be doing quite fine. However what about the people that created the languages you use? Those who built the processors you work on?
A lot of people will never need the things they teach in a standard CS curriculum. I doubt most programmers even know how to spell "automata". But then again, most programmers aren't doing anything new or ground breaking. Most programmers are simply rehashing solutions to problems already solved somewhere, or simply making small iterative steps. I have found that my own work seemed very "small minded" before I began my formal studies.
Even beyond that, I am now equipped to do most anything I choose involving this discipline. I've always wanted to create my own language, and now the only barrier is simply the time and effort I need to put in. I have all the requisite knowledge and background, and my solid foundation will allow me to easily (comparatively) pick up any new concept I might encounter.
The average programmer might never desire to create their own language, but for this field to continue to grow we need people to push the limit and innovate beyond our current limitations. To do this you need to have a deep comprehension of what you are working with.
However even beyond all of that, I wasn't content with not knowing the intricacies of computation. Maybe I'm just a naturally curious person (and possibly biased), but in my opinion the world of Computer Science is one of the most fascinating fields to have ever studied.
One last point... why not? Knowledge is power.
Edit: After reading some of the replies posted while I was typing, I'll agree there are outliers. You will always have those people who are able to become masters of their field with no formal training, but then again, those are a select few.
You never forgave that algebra teacher, did you?
Think of programming like writing an essay. Clearly some knowledge is required; you need to include some information in the essay or it's completely pointless. But the difference between a good essay, one that persuades the reader, and a poor essay isn't in the information it contains. It's in the flow of ideas, the juxtaposition of opposites, the emotional connotation of a well-chosen word, the ruthless elimination of extraneous words. The quality of a good essay comes from the skillful presentation of ideas as much as the ideas themselves.
Programming is similar. It's hard. Doing it well requires more than just knowledge of syntax or data structures or algorithms. It requires identifying the essential elements of the problem at hand, extracting their essence and crystallizing it as code. It means writing code that so simple that it seems so obvious and unremarkable that anyone could have done it. It means being able to move up and down the tower of abstraction, from bits flying around in memory to the concepts and language of the business domain, and from individual lines of code up to architecture and processes. It's a skill, like writing or pottery or motorcycle maintenance.
Now from your "I'm fine" list it sounds like maybe you're not interested in excellence in programming per se, just in the business value you can create by programming well enough to solve your customers' problems. That's a perfectly reasonable. That's how I approach design.
But if you want to be a good programmer, to really master the skill, then you need a bit more than a few tools that can solve most problems, and being able to learn new skills just in time. Which is not to say that an academic education is necessary. But it does mean you'll have to learn things that aren't immediately applicable.
Knowing how to solve a problem 5 different ways means you can choose the best way for the current situation, knowing that the other 4 solutions will probably be called-for another time. I've been in situations where "slick stuff" was absolutely appropriate. (For example, I once solved some tricky timing issues in multithreaded code by using continuations. Another time I used parser combinators to drastically reduce the size and complexity of a family of parsers, and eliminated a lot of bugs.)
I'm self-taught too, so I get it. But I wouldn't be so quick to dismiss the idea of building up a good foundation for your skills, if you're interested in developing them.
Prioritization is fine, but always be careful about rationalizing your own continuing ignorance of things that a lot of people claim to find useful.
(I actually ran into a min-cut problem in the wild today. I'm glad I recognized it as such, because it was kind of important, and I wouldn't have been able to solve it if I hadn't heard of graph flows and cuts. Hell, I might even have congratulated myself for having avoided spending time learning something so useless....)
I've looked in various apprenticeships like thoughtbot's and others, but at my age (30) I am not their usual target demo.
It's why I'm so grateful for hackernews. i learn a lot of great stuff here from the 'real' developers that I can then apply in my day-to-day.
http://en.wikipedia.org/wiki/Impostor_syndrome
http://www.inc.com/magazine/20060901/handson-leadership.html
During the first 10 years of my career, I used a language where I didn't have to "worry" about all of the kind of things I have to concern myself with now (using Java/MyBatis/Oracle).
I've always wondered what it was like using a "real" programming language and now I know - it can be tough but it's not terribly difficult. I love using the tools I've been reading so much about on various blogs and whatnot.
But I'm learning and I love learning and that's what I think is really important as a programmer. Some of the things in this post I knew about others, I'm going to have to research but at least it's easy to find useful help nowadays. Thank you Hacker News.
That being said, you don't need to know all that to get started. I probably would have hated a CS program if I had tried it in college. Now, however, I am completely fascinated by things that would have terrified me before.
There is a lot to be said for Just in Time learning as opposed to front-loading your knowledge Just in case you need it down the road.
The only thing I learnt from college was the list of topics that needed to be studied. I spent time learning those things practically on my own.
That was the thing that helped me land a job immediately after college.
So I would say that a college CS degree is really a subjective, It depends on the person and the college.
Any self-taught developer who has the interest to improve him/her self can and will learn the foundations eventually.
My university's CS department had just enough "time" to skim over the big topics (one database class, really??) while we ran around trying to please non-CS profs in classes that weren't really necessary for me (two chem classes and physics).
I'm all for general knowledge, but if I need to know anything about chemistry (which I haven't yet in my role as a web dev), then I can go learn it, or change my major and focus on it.
That's why the rise of edtech startups have been of interest to me: online courses like Algorithms: Design and Analysis from Coursera have been a godsend, at least when I have the time and energy to do it. It's not easy playing catchup with a full-time job, but there's even less time (and money) for me to go back and get a degree in CS.
It seems like many don't understand that not having pursued a CS degree is often a pragmatic one dealing with money, not because self-taught people are too lazy or unwilling to learn at a university level.
They have already obtained their degree and invested a lot of time and money. Or they're far enough along in life where they're giving up a lot more than a teenager or person in their early 20s if they take 4 years off to pursue a degree full-time.
I think these are articles are useful for people who are learning on their own, or who come from that direction. But if you're starting out at a self-taught person, from my experience, no one seems to care if you understand algorithms. You're better off building real things, and it doesn't seem close.
Developers should know security
Developers should know testing
Developers should know the business
Developers should understand marketing and SEO
Developers should should should. Everybody's different. Do what you need to do. No one is going to be perfect at everything.
Here's my 'should advise': Developers should stop listening and executing everyone else's ideas and execute their own.
>hey self-taught developers, here's all this totally elementary stuff that you probably don't know.
I'm self taught, but I have a very solid computer science foundation because I found that stuff interesting when I was learning. Looking at the other comments here, I guess that's not the default...
But realistically, this knowledge is rarely needed in most modern day application-level programming. Many decent developers can not only get by, but produce great applications without it. It's mostly a matter of the right skills for the right job. And as always, just getting stuff done is the #1 skill.
Read the Hacker Ethic. As long as one is curious the information is there. Set theory? Probability? Algebraic lattices and convergent data structures? Monotonic functions? Cache registers and word alignment on some rare architecture you've never encountered before? Need to know how to write a compiler? I've learned some of this stuff and more on Usenet, web forums, IRC chats, books; from github, bitbucket, CPAN, PyPI, quicklisp; and by going to conferences, meetups, and even on the job. Academia is not the bastion of Computer Science fundamentals.
As long as one is curious and has the intellectual tenacity to be critical then there's nothing that the ivory tower can offer that isn't available on the web, at your local library, and right on your damn computer.
We don't live in the dark ages. Why do so many Computer Science people insist that only they know the true knowledge?
That said, I feel that there is a gap because I didn't major in CS.
Although I had to read a textbook on Data Structures and Algorithms on my own, I don't feel like this is a particularly glaring gap. Interestingly, my math coursework did cover a lot of the stuff at the end of the algorithms book, since I'd taken graph theory, linear and non-linear optimization, numerical analysis. But I had to learn the basic data structures (trees, hashes, lists) on my own. While it took some work to learn this, it came naturally enough, because I consider data structures and algorithms to be very similar to math. You could study this stuff without a computer and get a decent understanding of it.
The big gap in my knowledge is more around compilers, operating systems, and that elusive border between software and hardware. I never took compiler design, and I think that languages are still a dark art to me because of it. I think I also would have benefitted from doing some very low level programming (when I was in college, "C" was still considered a "high level" language, but at least I had to struggle with memory management). Also, a lot of data structures that are optimized to interact with memory or hardware are still pretty much a mystery to me. Obviously, without this knowledge, my understanding of operating systems is going to be pretty limited.
(I still think there are dragons inside the CPU.)
Self taught programmers can write well but may be missing some of the nuance for why things are done one way over another or maybe be missing some tricks that save a lot of time. These limitations can be overcome by somebody committed to writing good quality code.
What I'd miss if I dropped out isn't any notion of a foundation, I'd be able to get it all from the resources mentioned on this page. What I'd miss (as in, it's absence would sadden me) is being able to discuss compiler design and other areas that may not be of interest to most working programmers with respective experts in the field. I'd also miss the impact the piece of paper would have on any potential greencard application but that's another story.
I started programming for a living before I got a CS degree. After I got the degree, the biggest difference I found (aside from the really cool knowledge I gained) was that I had a common language to use to talk to other people with CS degrees and an understanding of common methods that I used to take for granted.
Also, I appreciate the rigor behind a lot of CS fundamentals, and I believe I'm able to teach myself new CS-y things more easily and do my job better as a result. I don't think the CS degree is necessary, but I really really really believe it helps you in ways you may not realize until you get one.
The part about dismissing boolean logic really rang true.
A simple example in Python:
for dog in dogs:
print dogs.index(dog)
calculate_dog = something_complex(dog)
vs. for i, dog in enumerate(dogs):
print i
calculate_dog = something_complex(dog)You don't get taught anything (especially programming) you get out there and you fucking LEARN it!
Users couldn't care less about a perfect domain model, dependency injection or asynchronous yada yada.
They care if it works and Product Developers know this.
"Drivers don't care about different ways of reinforcing concrete or finite element modelling or yada yada, they just care if the bridge works."
If the users don't care, it's because they don't really understand why the software they pay for and put up with over the years becomes an unmaintainable nightmare...
And then a competitor pops up and they are dealing with the same sized data blazingly fast, instantly from the user's perspective.
And you look into it and they are using the same technology stack you are using.
It's at that point that you might start to care about the difference between a linked list and a hash table.
Of course users care about page load time - scalability should be built in to an application from day one (I never said otherwise). Modern Paas services allow for this more or less out of the box so there's no excuse not to have scalability built in.
I've built apps that scale well (over 100 concurrent users) but have still never had to worry about whether to use a linked list or a hash table.
I would call your product developer a cowboy programmer. Been there, done that, after the cowboy leaves the result is a maintenance nightmare.
I meant that product developers know when something is good enough (or "will do for now") whilst IMO software developers want to iterate and iterate to a perfect, elegant solution.
Don't get me wrong, the latter may be the correct choice to take but only when its for a feature that people are actually using.
From a business perspective, a software developer who is sitting on functionality thats "not quite right yet" is the cowboy programmer. But I guess thats just perspectives for ya :-)
ops question would be better addressed if it addressed it's audience correctly:
"Self-Taught Web-Developers: Are You Missing Your Foundation" - and again the answer would be no. Since it's essentially a form of text processing we're talking about. Entirely different audience/target/whatever.
There's also many many many algorithms books around these days. The average web developer doesn't read them, and why would he?
Long story short:
Any headline which ends in a question mark can be answered by the word 'no'".
http://en.wikipedia.org/wiki/Betteridge%27s_Law_of_Headlines