What Today's Coders Don't Know and Why It Matters
jfruhlinger writes "Today's programmers have much more advanced languages and more forgiving hardware to play with — but it seems many have forgotten some of the lessons their predecessors picked up in a more resource-constrained era. Newer programmers are less adept at identifying hardware constraints and errors, developing thorough specifications before coding, and low-level skills like programming in assembly language. You never know when a seemingly obsolete skill will come in handy. For instance, Web developers who cut their teeth in the days of 14.4 Kbps modems have a leg up in writing apps for laggy wireless networks."
Experienced people have experience in things they have experienced
tl:dr - "Get off my lawn"
If what I just said sounded like a troll, it was probably just a failed attempt at humor.
So your particular skillset has fallen out of vogue for a while; it happens. If this stuff is useful, it'll come back. For instance, a lot of the hardware related skills mentioned are still around, they're just considered to be a specialisation these days, in most situations it's safe to assume that the hardware either performs within spec or that the lower layer (OS etc) is dealing with any irregularities.
"Welcome to our world. We are the wasted youth. And we are the future too." Yes, I know these are stupid lyrics.
They don't know that old trick from liblawn
Lawn::GetOffLawn(kid);
they aren't trained to engineer software, and the industry hasn't incorporated good engineering practices.
The Kruger Dunning explains most post on
would explain why Runescape runs perfectly well over dialup or EDGE(4KB/sec) speeds, while most other games do not: The original creators probably had some experience that way.
...and we LIKED it!
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil" - Donald Knuth
Most developers will never need for their apps to run in constrained environments, and most employers don't want to spend money to eek out performance when average performance is perfectly fine.
Too many programmers get caught up in trying to make something the fastest, or most memory efficient, or makes the best use of bandwidth. When most of the time, it just doesn't matter. Such things are expensive, and in the long run it's cheaper to be fast and sloppy than slow and lean.
If you need web hosting, you could do worse than here
It's just like pilots should learn how to fly before being put at the helm of an airliner.
For justice, we must go to Don Corleone
Today's humans have much more advanced technologies and more forgiving world to play in — but it seems many have forgotten some of the lessons their predecessors picked up in a more resource-constrained era. Newer humans are less adept at identifying water sources in a forest, finding directions without a GPS, and low-level skills like starting a fire with two stones. You never know when a seemingly obsolete skill will come in handy. For instance, stone age humans who cut their teeth in the days of, well, stone age have a leg up in hunting wild beasts with just bare hands and stones.
I am an electrical engineer. Here's some news for ya: us electrical engineers do learn these skills, so don't bother complaining about the state of the world because new students are taught these vital insights in computing every day.
but other than that I fail to see the outrage. I also don't see a lot of value in learning things you won't likely need to use. Whats the cost/benefit to learning and mastering assembly if you aren't going to need it? Building software as if you have low resources is fine, so long as you aren't compromising quality to make sure it will run on an archaic hardware. Making things as lean and fast as you can is always plus... if you have the time. Which is another thing today's programmers deal with more: insane deadlines. Expectations are growing and deadlines are getting shorter, and today's programmers (unfortunately) cut a lot of corners and don't get the chance to truly optimize something, just so they can get it out the door.
well that was a waste of time, a terrible incoherent, lazily written article with very little anybody could actually use if they wanted to learn something if they cared to find out what it was they 'lost'. There are so many things that people have to deal with in projects today, that having to deal with limitations that are artificially imposed by ideology, which insists doing things the old way... it's just nonsense.
Why not then say everything should be done with a hard limit of 5MB hard drives or better yet, with throughput of punch cards?
If the author wanted to say something useful, he failed.
You can't handle the truth.
What is the sound of a pointer dereferencing to NULL?
Link in the summary is to the print page. Thanks jfruhlinger!
I remember when bits were made of actual stone, hand crafted, and strung by hand into computational frames. Today's kids don't even understand that this is what we are referring to when we talk about "Frame Works" today. Those Frames were tons of work, let me tell you.
Computational systems used these frames so that sometimes you had to go through several of them to get to your goal (These were the early AND gates), and other times you allowed users to pick which one to pass through (OR gates). When you forced people into exclusive choices (such as gates to bathrooms) these frames were referred to as exclusive gates (use this one if male OR use this wone if female, or XOR gates).
We used simple trip wires in our frame works to implement inverters, Very effective at reducing time wasted with managers. (Generally once a manager has been inverted a few times, they leave you mostly alone.)
Knot gates were generally frameworks made from pine.
I could go on about heat sinks (Hot rocks used to warm water) and other early computational technologies. But all of this is lost on this young crowd who don't even remember Java used to be drunk black for a nickle.
I do agree with you. I'm new to programming myself, but I've always felt the need to learn more about the computer than just the high-level language. That's why I want to take up PERL. Apparently, there's still a strong Ruby community out there, so I might take that up as well. On top of that, I like to plan out my programs. I like to know exactly what it will do before I do it, which may require writing out the code first. I'm only two years into programming, so I still have a long way to go. I just want to make sure that what I do is very efficient so that all my future supervisor has to do is sit back and trust me.
One of those interviewed in the article complained about the fact that modern day programmers try to solve the problem through an IDE or debugger, instead of putting in statements which change the output of the program. They wanted printf debugging. While I do value a good tracing subsystem, I for one, am grateful for modern debuggers which let me view the state of the system without having to modify/redeploy the code.
we had to code uphill in 10 feet of snow on an abacus using roman numerals.
PocketPermissions Android Permission Guide
This pops up every few months really, somebody goes on and on about how much harder it was to program "back then", and that programmers who have been programming longer are better programmers. Duh! It's called experience, it has nothing to do with how "easy the kids have it these days". How does this stuff get to the front page when my story about the Columbia being destroyed by the Starfire Optical Range was completely swept under the rug. Ditto to my story about Giffords' partial brain transplant into the nine-year-old clone of her, the young Christina Green. Slashdot sucks.
Comments/phrases like these completely fail to grasp that things like this are RELATIVE. What is 'resource constrained' today isn't what was seen as 'resource constrained' 20 years ago. Likewise, many young programmers _today_ (including myself) DID in fact learn to code in what would be seen as resource constrained environments compared to today's machines. I cut my teeth on an 8MB Win95 machine and later a 32MB machine. Sure, that amount of RAM to play with is an insane luxury if we're thinking back to early/earlier 90s or 80s. But compared to what we have now it IS resource constrained. And heck, even mobile devices have more than 32MB to play with these days.
20 years from now 2 or 4GB of RAM will look like 'resource constrained' environments, and all of us who are 20-year olds now will be thinking "Herp derp, this new generation won't understand the resource constrained 32MB days!". And then 20 years from that, their experience will help them operate in 'resource constrained environments' when several TB of RAM is the norm or something
TL;DR: This is all a stupid circular pattern where each generation seems inferior to the last but still has some useful knowledge relative to specs of modern machines
How the fuck do you forget something you were never taught in the first place?
This article should really read: "Crotchety old programmers fail to pass on tricks of the trade, then complain anyways"
Eh, didn't someone remind us of this a couple of months ago? Seems like someone really has teeth to grind with modern coders. Get a life, you suspicious person!
I inherited an 8051 (spit - fucked if I know why anyone likes this CPU) project at my old work. I asked why they didn't turn the C optimiser on, the answer was the optimiser is broken as the code wouldn't run which sounded like BS to me. The owner with 30 years of embedded eperience was satisfied with this explanation. I got it working by putting the volatile keyword on some globals that were shared between main() loop functions and interrupts and bugger me if the application didn't start working with the optimiser on! My respect for the owner and his company began it's downhill slide that day. So even grumpy old codgers with years in the field like my old boss can be total n00bs too.
Most of my programming experience is in either C or assembly language, and a good portion on embedded devices. Recently at my job I have been learning perl, which is obviously an entirely different animal. I find it particularly interesting coming from this background to look at the different data types- In assembly, there really are no data types but only the hardware, in C, the data types are basically just abstractions of the hardware (pointers, arrays, etc). But perl has all kinds of things like typeglobs, and hashes and references (which still strike me as the english major's version of a pointer), which are far more abstracted. The hardware is doing the same things as always, but the model of the computer portrayed by the language is much different.
One of the first things I learnt when troubleshooting problems is that it is probably a problem with your code, and not the hardware or external software libraries (apart from rare cases).
I'm new to programming myself, but I've always felt the need to learn more about the computer than just the high-level language. That's why I want to take up PERL.
(emphasis mine)
This possibly the most hysterically unintentionally funny thing I've read in a long time.
General Relativity: Space-time tells matter where to go; Matter tells space-time what shape to be.
We still use straight C, sometimes even intermixed with assembly. We know all about resource constraints, given that our microcontrollers sometimes only support a few kB for instructions and data RAM. As far as debugging goes, I'll see your debug-with-printf and I'll raise you a debug-with-oscilloscope-and-GPIO-toggling.
:(){
less is definitely more, atleast if you ask me.
New things are always on the horizon
# man sex
which is totally what she said
it will last longer and be less hassle
"I see poor understanding of the performance ranges of various components," says Bernard Hayes, PMP (PMI Project Mgmt Professional), CSM (certified Scrum Master), and CSPO (certified Scrum Product Owner).
There's such a thing as a certified Scrum Product Owner? Am I now being encouraged to go get management trained on how to be certified at owning Scrum Products?
I'm not sure if I can take what someone with a set of certifications this ridiculous says seriously.
-- "So they told me that using the download page to download something was not something they anticipated." - Bill Gates
Even modern operating systems are largely written in HLLs
I guess you consider C a High Level Language. I think a LOT of people would seriously disagree with you.
I don't care what OS you are using. Those are written in C and Assembler. Look HERE for yourself.
You are not going to find any php, python, java, perl, ruby etc. etc. there, not a line of it.
Mostly your comments are pointless. Most really "good" HTML is still written by hand. It may get spewed from some content management system, but who do you think wrote all the HTML and CSS for those? Do you think JOOMLA magically coughed it up?
You are seriously clue impaired.
Hey KID! Yeah you, get the fuck off my lawn!
There's a big difference between "optimization", and "designed with standard performance considerations in mind" though. The latter should always be done. The former, only when there's a genuine need to run As Fast As Possible (tm).
Too many new coders today have no grasp of EITHER. They don't understand even the basics of algorithmic efficiency ("big O" notation, the difference between a linear and constant time lookup, etc), the cost of memory allocation (doing things like unnecessarily creating a new instance of a var or object inside of a loop, for example), or how to properly normalize and index a database.
So we wind up with situations where a web service is performing slowly... because it's looking up a DB record based on a non-indexed string match. :P (A real-world example encountered this week). And things like this aren't caused by laziness, or because "the project got done faster", they're caused by simple ignorance of what's actually going on. And why is this? Because when the developer originally built it, the brute force approach "was fast enough" with his small local dataset.
"Mind, as manifested by the capacity to make choices, is to some extent present in every electron." -Freeman Dyson
Every once in a while I read an article on Slashdot about how the current generation of programmers churn out only the shittiest of code; how they have no idea how a computer works; how they could never program without a fully-featured IDE with Intellisense that renders instantly. As an undergrad in a CS/ECE discipline, this has always surprised me-- I can only speak for the curriculum at my school, but I can assure you, these mythical 'lost programming skills' are alive and well. Most of the supposed missing skills are addressed in the following mandatory courses, required for graduation from CS/ECE at my school:
Yeah, sure, the some folks at the bottom of the class may be shitty programmers who scraped by with a "barely passed" in the mandatory courses. But surely they existed 10, 20, 30, 40 years ago as well. I'm not sure where people are getting this idea that new coders have no skills. What do they think we do for four years, set up MySQL and write PHP for it?
You need to wait until the shit is done, then profile it. You suck at knowing what needs to be optimized, no I don't care how good you think you are. Ask the experts, like Knuth or Abrash.
So if the speed matters, or the RAM usage, or whatever you write the program, then you profile it, in real usage, and see what happens. You then find where spending your time is worth it.
For example support you find a single function uses 95% of all the execution time. Well, until you've optimized that, it is stupid to spend time optimizing anything else because even a small gain in that function will outweigh a massive gain elsewhere. You need to find those problems spots, those areas of high usage, and optimize them first, and you can't do that until the program is written and profiled.
That is also pretty common too, the "Couple areas that use all the resources," thing. It is not usual for it to be spread across all the code. So you need a profiler to identify those and you then need to focus your effort. You can then break out the ASM hackery for those few lines that have to be super fast, if needed, and you'll achieve most if not all of the result you would from doing the whole thing low level.
Some old-school developers prematurely optimize for things we no longer need to optimize for (and shouldn't). From an older post of mine:
He was optimizing for resources that were no longer constrained, and consequently pessimizing for the resources we actually cared about. RAM? Dirt cheap, at least for the dataset sizes involved in that project. Much more expensive was all the extra disk and CPU load he was creating on the company-wide database server (which is sufficiently powerful to serve the entire company when it's not being deliberately assaulted).
I'm not "anything goes" by any means, and I'm the guy responsible for making sure that lots of processes can peacefully coexist on an efficiently small number of servers. But for all intents and purposes, most of our apps have unlimited resources available to them. If they want to use 100% of a CPU core for 5 minutes or 2GB of RAM for half an hour a day, so be it. I'd much rather run simple, testable, maintainable code that happens to use a lot of server power than lovingly hand-mangled code that no one but the original programmer can understand and which interacts with the rest of the network in entertainingly unpredictable ways.
Dewey, what part of this looks like authorities should be involved?
Over the last few years the most disturbing trend I have seen is programmers that do not have the ability to ship a product. You can talk all the shit you want about architecture, cute technology, methodology but if you don't ship product you don't count.
Got Code?
developing thorough specifications before coding
Believe me, if I could get anyone to approve, sign-off or even read a spec before it had to be developed, I'd write them a lot more often.
Just because you're paranoid doesn't mean there isn't an invisible demon about to eat your face
# man sex
I see, you are working as root. You'd have safer sex from your user account.
The Tao of math: The numbers you can count are not the real numbers.
My own experience has born out much of what the author states -- yet he really doesn't go far enough. The problem is less with the new coders and more with the system and what University's and Computer Science departments are teaching (or NOT teaching, as the case may be).
Even since as far back as 25 years ago far too many programs have been aimed at theoretical computing models and don't teach practical design methods -- especially for embedded applications. At the company I used to work for, we specifically would not hire anyone with a Computer Science degree unless they came on board as a contractor for 6 months first (until we could see if they actually had a clue) -- EE's and ECE's we would usually hire outright (though we sometimes regretted it).
The emphasis on people not understanding hardware interfacing in the article is spot on -- I deal with programmers quite often who have absolutely no clue what happens when the code they have written actually runs and tries to talk to hardware (and they have equally poor understanding of assembly code and how compiler theory applies to the translation between a high level language and what actually gets executed).
If you are dealing with Windows or OS X apps that have what amounts to unlimited memory space and an insanely fast processor, this is borderline acceptable (though it still yields horrendous code that is often far more bloated and slower than it needs to be.
To those who say that it is a bad idea for a company to allow their programmers to "waste time" writing good or optimized code, I say, "it all depends on your target market" -- and whether or not you have to support the product into the future.
I personally have worked on a project where we had 3 high level engineers spend 4 months to re-architect code in such a way as to allow us to eliminate a single IC that cost about $0.25. In essence, we spent a man year of effort to eliminate a part that cost less than a quarter -- and it was an EXCELLENT investment and made perfect financial sense. This IC was on our display processing board and went into basically every item we produced (TV sets), on multiple production lines and across basically every screen size. This same design was used (with slight modification) over almost 6 years. In each average year, over 1.5 *MILLION* of these boards were produced and sold -- which means that eliminating that part saved us around $375,000 *per year* (and probably close to $2.5M over the life of the design).
Similarly, I actually spent almost 3 months hand optimizing Keil C code (and hand-coding some routines into assembly, as I can generally do a far better job than the compiler) to allow the code to ship in a micro with one size smaller embedded ROM (at a savings of several DOLLARS per part). We shipped our initial production run with the larger part to meet schedule and then shifted over to the smaller one as production continued.
Other things that current software engineers I run across are completely ignorant of is that there ARE errors in hardware and that there ARE differences between different manufacturers devices -- and they often have to be treated quite differently. I primarily write low level embedded device drivers for a living -- and let me tell you, the number of glitches I see in hardware are legion. So are the differences in parts that are "theoretically" identical from different manufacturers. A good case in point would be when our purchasing department decided to sub a Xicor 24C series I2C EE for an ST 24C I2C EE. They are supposed identical parts, with identical specs, with identical memory capability, etc -- but the Xicor part handled the internal voltage pump differently for consecutive rewrites across blocks of memory cells than the ST part did. The end result was that while the part initially worked, they began failing in the field within a few months -- where some of the original ST parts are still working to this day. There was nothing wrong with the Xicor part, per se, and once we ch
Oddly enough, John Carmack says something similar in his 2011 Quakecon Keynote. Ninety minutes of rambling on about Rage, the importance of static code analysis and programming the Xbox360 and PS3 to the metal. Well worth watching.
I've now read the original article a couple of times and gone through the main comments a couple of times. ...and I am confused. It seems that many people commenting have not actually bothered reading the original article to see what was being discussed there - and have jumped straight in with comments about what they (mostly wrongly) think or assume the article was about instead.
Many of the skills discussed in the original articles are about avoiding and/or managing a diverse range of real-world problems of the kind still regularly seen today.
AJB
We have more code verification, static typing, contracts, tests and assertions than ever. Somehow I doubt the above.
And if by 'specification', you mean a spec on paper separate from the code, that's because the lessons of the past have taught us that specs are never current, so what's the point? With more expressive, higher-level languages, the programming language becomes the specification language, and a specification in such a language is then naturally executable, ie. code is the specification with sophisticated types, or an executable program can be extracted from the specification ala Coq.
Higher Logics: where programming meets science.
It applies to computer science too. Premature optimization may be the root of all evil, but it doesn't mean you shouldn't write code without a high regard for how well it performs in whatever environment you have. A decent understanding of the resource limitations (whether they be ram, io, time, or something else entirely) and a -very- little bit of effort can go a long way.
It's all about balancing coding effort vs the reward in doing so. It's also worth considering your users time. Shaving 10 seconds off the load time on an application may seem silly to a coder if it takes 4 hours to do it... with say a minimal example of 10 people in your office starting your app several times a day, it would take months to break even on productivity. However if you are developing a widespread application, saving 1000 people 10 seconds twice a day is a whole different story. 100,000 and you've just wasted 23 user-days per day to save yourself a one-time half days work. Great job dude!
Use common sense. Balance cost vs benefit. It's not that hard.
...today's coders don't know is that their innate talent doesn't trump our experience. At best it only makes them equal to our innate talent that we still have in addition to all our experience.
When a fresh-out-of-college coder thinks he can enter the maintenance cycle of a well-established product and change how everything is done, with no knowledge of any of the client needs or painful events that drove the existing processes, all he does is create a tremendous amount of pain for the clients and embarrassment for himself.
You hear me, new guy? Stop being a bull in the china shop! Learn the damn system before you go changing it.
And also just meeting the functional requirements is NOT ENOUGH. Your code must also be maintainable by people who didn't write it, scalable to demand far greater than a handful of users on a QA server, AND it must be secure, which you won't get right if you haven't studied up on the exploits.
Sheesh.
Don't underestimate the value of a spec.
It's a very good idea to write a thorough business plan before going in for a business proposal (and loan), as it forces a person to think through the different scenarios and problems.
Likewise, when somebody shows up with a well-considered spec--usually after some informal Q&A with developers--I find the outcome tends to be very good. Even when the spec evolves (usually via email or voice) and becomes drastically different, the original spec is still valuable because:
1. It thoroughly highlights the business problem(s) that needs to be solved.
2. It forces the writer to consider whether the proposal is actually a good one.
3. It gives a starting point on a candidate-solution (and gives coders a chance to think about a counter-proposals and tweaks).
4. It gets coders thinking early-on about some of the outlier business conditions--not necessarily completely fleshed out in the spec.
5. Down the road, it gives people a window into #1. This is important if you're dealing with esoteric or arcane business rules.
It's all too easy to blame developers for a shoddy job; but often, analysts will ask for features that with a bit of thought were probably a bad idea in the first place.
When the article is not vague, it is plain wrong.
Recently I made teo rather trollishly titled posts on the same subject, on my Livejournal:
http://abelits.livejournal.com/41968.html
http://abelits.livejournal.com/42052.html
Seeing how even supposedly knowledgeable developers post unreadable, vague opinion pieces, I think, I will have to add more to those.
Contrary to the popular belief, there indeed is no God.
ecosystem
lol
Contrary to the popular belief, there indeed is no God.
I agree that saving time for people is something, but I also think that a well written and optimised code is the best way. If you write something in a sloppy manor then later down the road that could cost more for the company in further upgrades due to elevating the scale of a program. I am of course new to programming and writing code (3 years). Well for example you have a web page that runs fine and dandy say using "wordpress" it helps a user to get a blog up fast. but then you have to "tweek" the hell out of it to handle a larger number of page views, this leads to more work. The same program can be written in a far more officiant manor. As a junior web developer I find that "bloated code" slows down things a fare bit. When you can do the same thing in 1 line of code as you can in 10 then why are you doing it in 10 ! In short I think that coders should do the best and most economical jobs they can, saving money and time, I mean rather than just saying "oh we will chuck another server at that and it will be ok". I might be wrong about this so please correct me if I am wrong.
One of the problems I find I encounter more these days than in the past is that there the coder is increasingly at the mercy of more and more layers of underlying code which is more or less impervious to reasonable debugging.
The performance of your application code was in the past pretty deterministic - not usually very much between the OS and your code and the OS usually had a closely-defined role and if it failed the consequences were usually obvious. It was also exhaustively documented so there was little to take you by surprise.
These days your code may be on top of a bunch of middleware running on top of an intermediate language environment on top of a virtualised machine and OS with networked storage. When these things don't behave as you expect, good luck with finding anyone who knows about all of the various internals enough to help you solve the problem.
And, indeed, good luck with writing your application. Half the stuff the middleware provides to you will only be documented in someone's blog somewhere. If you're really lucky, the Release Notes will be accurate in its report of the stuff that doesn't actually work as documented. Some part of it will assume a model of resource allocation that is unhelpful to your specific use case but you won't find that out until halfway through your project.
This is just part of the IT hiccup that occurred with the advent of the microprocessor - Computer Science was forgotten and painfully relearned over a period of about 30 years. Unfortunately, it's rather stagnated in the interim and the problem is not so much that people have forgotten the lessons of the past, they haven't actually developed the new tools to deal with the staggeringly more complex environment in which software now lives and is developed.
First to declare interest, I'm 60 pre-internet and generation COBOL/Assembler, get off my lawn generation too!
That said, there's a great many good reasons for doing things economically, concisely and elegantly, Occam's razor, optimal use of resources [a financial matter too], no constant upgrades and server/desktop refreshes. No endless addition of extra storage because stuff is duplicated everywhere. By the way, if someone starts a project to de-duplicate the web down to a 'safe' evel [only ten copies of each thing not 2K] , I'll sign up.
I also resent, mainly government who send me half a dozen self-congratulatory jpegs with each email. You're wasting bandwidth and blocking up the pipes, you folks.
So, if we pay a little attention, we won't need the sprawling power-hungry data centres that all the big players seem to be building. WE won;t need the constant hardware refreshes [admittedly a lot of those are Windows 'upgrades'].
Anyways, don't listen to me, I'm old and grumpy, but take a look at this: http://en.wikipedia.org/wiki/Green_computing especially Product Longevity.
On y va, qui mal y pense!
5k would have been heaven when I first started typing Z80 hexadecimal into a computer.
No sig today...
Heal a broken leg, milk a cow, give birth to a child. Sorry, I'm such a noob...
I do lowlevel stuff like that on a daily basis on microcontrollers. I do it in C.
That is as low of a language as you need to go. I don't see any point in writing assembler ever.
Yes, it's useful if you can read it for debugging and you will sometimes use a handful of assembler instructions embedded into your usual programming language, to use special functions of your controller. But writing programs in assembler... just no. Just because it can be done, does not mean it's a good idea to do it.
Driven by the web (and possibly games) industry, programming has become a race: whoever ships the product or new feature first, gains an advantage. So development speed is much more important than in the old days, when you could still win something by cramming more features into 64KB RAM or when you paid for your rented computing time and could spend months optimizing your code. Consequently, architectural decisions are still important, but optimizing your code - unless it becomes a specific requirement, for example, when you simply cannot afford to buy a box with 512GB RAM that can run your current stuff unmodified - is not.
"I love my job, but I hate talking to people like you" (Freddie Mercury)
Their performance varies a lot, depending on factors you don't or can't know. The back-of-the-envelope computation example in the article goes through a much longer chain of deduction these days:
Fortran statement
x86 instructions
RISC-ish micro-ops
full-speed until:
* cache empties
* branch prediction fails
* speculative execution runs out
To a Lisp hacker, XML is S-expressions in drag.
That's often what it means, and not by accident. "Don't optimize prematurely" means don't optimize until there is evidence that you need to optimize, and then only optimize what there is evidence that you need to optimize. In practice, that means (for many components) never optimizing many aspects that could, in theory, be optimized, because optimization never turns out to be the change that offers the most value for the effort.
Don't optimize prematurely ultimately is just a special case of "do the one thing that delivers the most value for the effort, and repeat as needed". Until optimization od the code for any particular characteristic (whether its speed, memory consumption, or something else) is that one thing, doing it is a waste of resources.
Ugh, I cut my teeth when 1200 bds was bleeding edge... Not sure that I agree completely with the author though. Whether a programmer write efficient code depends on his natural skills, not when they were born. Regardless of whether one programmed in assembly in some distant past in order to squeeze every single CPU cycle they could, I think natural skills is what matters most. Bad programmers back then when resources were very limited, would still suck big time nowadays producing efficient HTML/PHP/Javascript.
I agree that it is very useful to know how things really work under the hood, and good programmers, past or present, tend to naturally inquire about "what is behind," so even today's naturally skilled programmers will do as well as naturally skilled programmers of the past IMO.
My problem in this distant past is that I was on a never ending quest to save yet another CPU cycle, even if it meant zilch to the end-user. I eventually understood that shipping a product is quite important, and changed my focus to convince management that "shipping a product that doesn't suck is quite important," and all went well from then on.
A classic sequence:
unzip, strip, touch, finger, grep, mount, fsck, more, yes, fsck, fsck, fsck, umount, sleep
I dont think that 16 bit programs would see a proportional gain if such a thing as a 3.7Ghz 486dx existed. If anything the newer python-jython programs are better because those programming languages are more tolerant of the hardware running the programs. In therory a 20Mhz 386 + AMD or Intel math coprocessor was close to the same thing as a 486dx 20Mhz . Yet some software then would not run on different brands of memory with same motherboard/processor/coprocessor combination. I totally expect a 32 bit programe that works on a 512 Mb Celeron 2.0 system & win XP to work just as well on a 4 Gb Phenom 1090T system &win XP , the only difference should be execution speed. Back then when they were broken I fixed them, now I just get a new one just like everybody else.
Unfortunately, despite having a bachelors in CS, and several years of web programming experience, I have only recently discovered OOP design patterns. They are very useful methodologies, and I think today's programmers, especially in the web development arena are far too ignorant of these useful additions to one's toolbelt.
Patent: from Latin patere, to be open
I don't think programmers are less capable now than earlier. There's just been a loss of connection between the software and the hardware. I happened to look at a piece of code a young programmer wrote in C++ to insert a 4-byte length field at the beginning of a file. A simple task, keeping in mind that the field had to be big-endian. This programmer, however, formatted the length value as an ASCII hex string, decoded the hex string 2 digits at a time to place the bytes into an array, and then wrote the 4-byte array out to the file. This solution boggled my mind!
As other posters have noted, I think it is because colleges teach using ever higher-level languages and are skimping on the lower-level architecture and operating systems courses. (On the other hand, we learned LISP and SNOBOL when I was in college, so high-level languages are not a bad thing; my own preferred languages are C and Scheme.)
As an architect, designer and coder, I see this all the time, and fight it all the time, but usually lose. There is a place for ORM layers, dependency injection, TDD, poorly documented libraries, closed-source libraries, etc.; however, my experience leads me to believe that most of the time, in expert hands they are unneeded, while in less than expert hands they just get in the way, create more work, slow things down, and make both getting to market, *and* subsequent maintenance, orders of magnitude slower.
I often work with people who would rather write 1000 lines of XML than 25 lines of SQL, or write 25 irrelevant unit tests rather than gather and correctly implement one testable requirement. Give me a managed environment (Java/.NET/Python), a decent RDBMS, and a decent, preferably managed API around any hardware I need to access or I/O I need to perform, and I can generally get the job done with few if any other tools, and it will get done quickly and be at least as maintainable and flexible as the more "enterprisey" solution that needs 50 incompatible libraries just to build. But then the so-called "architects" whose experience comes from reading Pointy Head Weekly^H^H^H^H^H^H Gartner, rather than building or maintaining real systems, will tell me I'm doing it wrong, and make me redo it with the 50 libraries.
"If you're right, and we're just making more work for you, well, think of it as job security." Another canard. Job security comes from adding value and contributing to the success of the organization. Which I try very hard to do, and others try very hard to undo. Not so much at my current job, but my previous employer - a good, but very bloated and bureaucratic organization - was famous for it, and ended up having to outsource almost all their development because it became so inefficient. Now, a bunch of people in Chennai have job security, instead of my former colleagues, because they will be adding value whereas our "architects" did their very best to ensure that we could not.
Nonaggression works!
Yes, there really are micros much smaller and cheaper than that. $2 in production quantities can get you 128k of Flash and 16k of SRAM on something with a CPU decent enough to run sloppy C code. You're thinking much too large; think $0.30-$0.40 for the cheapies. Google around for the Atmel Tiny4, Tiny12, or the Microchip 10F family for starters...
You are correct about the quantities of scale, but remember that if that electric toothbrush is $40 at retail, the company probably didn't spend more than $8-$10 in materials to build it. At those prices, $0.50 makes a big difference when you are shipping 100K or 1M each month.