Real Ultimate Programming Power

**Stack Overflow is only a few months old and already it contains many
**a substantial critical mass of collected wisdom from across the
**breadth and depth of the software industry. Ultimately I think the
**full impact of stackoverflow.com in advancing the state of the
**industry will be very substantial and will vastly exceed many of the
**fad processes, checklists, and rulesets of today.

There is nothing in common between answers to specific programming problems and general guidelines, wich are a way to abstract vast knowledge accumulated by experimented programmers

Your fanboyism is not inspired :stuck_out_tongue:

**Your blog has become the Enquirer of the technical blogs. I read it for the scandal and gossip.

I agree with this so much, there is a certain taste toward bold and uninspired statements lately …

@Raph, you don’t get it.

Consider apprenticeship, what are the key elements of apprenticeship? How does an apprentice acquire the specific and general skills of a craftsman? Well, the master craftsman will demonstrate work for them so that they may follow the example; the master craftsman will guide their work by correcting their mistakes and giving feedback on their work; and the apprentice will spend years doing actual, real work with the master craftsman available to help with the harder parts. Furthermore, constant practice will reinforce certain themes from the many instances of specific guidance from the master craftsman which are part of a broader context of quality craftsmanship. And, of course, ongoing discussion between the apprentice and the master craftsman will further develop general ethics and guidelines of work.

All of these elements exist on Stack Overflow. Stack Overflow is a communication channel which connects experienced developers with less experienced developers. It’s not nearly so worthwhile as an actual apprenticeship but providing even a fraction of the world’s less-experienced developers with even a fraction of the value of an apprenticeship adds up, in total, to a honking huge effect on the software industry as a whole. Stack Overflow is like pair programming with the entire software development industry.

It’s easy to underestimate Stack Overflow, after all it’s just a QA site. But if you spend some time thinking about it seriously and imagining the cumulative impact that it’s had and that it will have, it’s rather astounding.

It’s all the more remarkable when you consider that rather than being force fed this stuff people are eagerly consuming it. People ask a question from some problem that requires immediate attention at work and they not only get an answer, they get a little bit of insight into how other programmers work, and they also, sometimes, get tiny little morsels of wisdom from more experienced folks. Perhaps they even get told that they’re going about things entirely the wrong way and are given examples of better ways to do things. These are small things in isolation, but they each have an impact, and they are many.

One could do far worse as a means to acquiring an education in software engineering than to do nothing other than visit stackoverflow.com and read through the various questions and their answers under the best-practices tag:

http://tinyurl.com/cps9ld

In response to Stephen R,
I’ve had allt these high beliefs in object oriented design and all sorts of things, but when I got a job and the system they have is all spaghetti and they’re making good money and no one complains. The customer can’t see the code you wrote. So is it worth it? Maybe…
The post was meant to be ironic, which you somehow didn’t figured out…Maybe you can figure out how to solve todays coding problems(or maybe you have you’re head all uptight with all sorts of abastact ideas with little immediate practical value)…

In the meantime, bashers focus on getting deliverables out the door using the resources and people at hand, while the cheerleaders blaze better trails.

The part you are missing is that the cheerleaders are saying the same thing. Following a few basic guidelines won’t make your project take longer AND it will be more maintainable. Sort of a win/win.

The part that has confused me over the past two blog posts is the assumption by some peopole that following basic guidelines (or principles, or whatever we feel like calling them) is somehow difficult, when clearly it is not.

Deliberate irony or not I think the argument in this post undermines the previous one. The post on Ferengi Programming was arguing that you should not use principles and processes too rigidly, but let programmers think critically about there work.

But in this blog the argument is that 80% of programmers are too stupid or lazy to ever understand decent principles. But if that is anywhere near the case, surely that would mean you do have to start enforcing these principles rigidly, and have a good process to ensure they are applied correctly. Otherwise the 80% of your workforce will be drowning out the “elite” programmers with their dreadful code.

As I understand it, the original complaint about the SOLID principles was that they were written by someone who had no real-world experience. That getting things done in the real world was more important than code quality.

I’m beginning to wonder if the same charge couldn’t be made about Jeff’s posts. As far as I can see his only experience of product management is StackOverflow, which only has a handful of developers, all of them “elite”. It also has no real customers, or deadlines to meet, and being a website can easily have bugs fixed after release.

But in the real world there can be projects with hundreds or thousands of developers, and the cost of missing a deadline might be millions. In such environments there just isn’t the luxury of making it up as you go along, or reinventing the wheel just for the learning experience. You have to have some sort of process, some principles, to have even the slightest chance of not having the project fall into a blackhole.

Rules are for the fools and guides are for the wise.

@anon

It’s a link to a Youtube video of the Daily Show, not horse porn.

Youtube is blacklisted here. So I googled it. Not a happy result.

And besides, do you normally blindly open every link you see?

On silly websites no. On what I thought was a sensible work related site I don’t always take the extra 2 secs to hover, wait for url to appear, read url. After clicking on 3 previous sensible links I didn’t think to bother url checking the 4th. But now I know coding horror is into rick rolling I will check in future. Or maybe just read it less.

Wedge wrote:
http://tinyurl.com/cps9ld

Oh yeah like you’re going to get anyone clicking on that. We can’t even see the url to find out what kind of dodgy activities it may be linking to.

Any list of essential developer acronyms is incomplete if it does not contain RTFM.

Atwood has jumped the shark.

+1 for RTFM

I try not to comment this late, but I just saw a TED video that made me think of this discussion.

http://www.ted.com/talks/barry_schwartz_on_our_loss_of_wisdom.html

A Wise Person Knows: When and how to make the ‘exception to every rule’ (at 3:50 in the video)

(this one is slightly modified to re-focus the idea toward programming)
as we turn increasingly to rules, rules… may make things better in the short run but they create a downward spiral that makes them worse in the long run. [Skill] is chipped away by an over-reliance on rules that deprives us of the opportunity to improvise and learn from our improvisations. (at 8:40 in the video)


Also, I like Dhananjay’s exercise analogy, because I like to check out different exercise routines and talk to other people about stuff they do. Then, I incorporate those ideas into my own workout. (I don’t just take a pre-written list of exercises and perform them)

This is exactly what Jeff talks about doing with programming. To me, that’s the point of this post.

and yes, I do realize Dhananjay was arguing against Jeff’s position. I found his analogy useful, anyway :slight_smile:

Exercise may be a bad analogy because you get immediate feedback from your body. If you’re doing something wrong, it hurts, and in a bad way. If you’re doing something right, it hurts, but generally you can tell that it’s hurting in a good way.

With programming, how do you know that it hurts? How do you know if it’s a good kind of hurt or a bad kind?

A few quotes that I thought were insightful:

cc - Though, having so many principles to follow has some draw back. Some people just don’t try to understand them well before using them.

wedge - It’s not nearly so worthwhile as an actual apprenticeship (referencing StackOverflow.com)

Steve W - As I understand it, the original complaint about the SOLID principles was that they were written by someone who had no real-world experience. That getting things done in the real world was more important than code quality.

Jeff Atwood Remind me again – who, exactly, are we writing these principles, rules, guidelines, and methodologies for?

I would like to answer that question, but first a short story:

I feel like my first 12 years of my career was wasted.

I was a talented programmer. I could solve every single problem thrown at me in a fairly efficient and intelligent manner. The code that I wrote worked. I had read nearly every book I could get my grubby little hands on, yet still I was missing something.

Finally, 12 years into my software development career, I met someone capable of mentoring me.

Looking back I can truthfully say that most of the code I had written before that sucked, even though my managers and co-workers thought I was a programming demi-god.

Before and after my apprenticeship I can tell a difference. My mentor can tell the difference. There is a hugely astounding difference.

Now, re-reading many of the books that I had read prior to my apprenticeship I can fully understand them and apply them… but that’s because I’ve already experienced the problems these books are trying to solve and I had someone to help show me the correct principle, design pattern, etc to apply for any given problem.

A knowledgeable person reading correct principals and guidelines can recognize them as correct and apply them correctly.

A less experienced person will generally reject them as written by someone who had no real-world experience if he even understands what the author was trying to say in the first place.

To answer Jeff’s question: We’re writing these principals as a way of verbalizing and fine-tuning that which the masters and mentors already understand. They’re not in and of themselves capable of teaching anything. They’re to be used as a bible, dictionary, glossary and reference manual, not as a teaching textbook.

For those that have not yet mastered their trade, the best we can do is to mentor them. Let them make their mistakes and then kindly, gently, show them the better way of doing things.

I’ve been on the giving and the receiving side of such a relationship and I have to say there is no other way. There is no golden solution… or at least none that I’ve found so far.

Nice article!

Sorry, Jeff, but I’ve pretty much lost any professional respect I have for you. You are a hack who doesn’t know he is a hack. You are yet another guy, who calls himself a programmer, that refuses to listen to good advice and is determined to blaze your own trail and ignore the wisdom of those that have gone before you. I’ve spent years working with people like you who keep making the same mistakes over and over and pontificate about solutions. All the while ignoring the evidence surrounding you. You mock cowboy coders, but failed to realize that it exactly what you are. You fool yourself into thinking you are a professional because you don’t use VB and read a few blogs.

You are a hack. And irrelevant.

unsubscribed.

If we look at just a few items from this list…

1969 - Structured Programming

Are you writing applications in C, C++, Java, C#, Pascal, Ruby, Perl, Fortran 78, or …? Oh, guess what? You’re benefiting from structured programming.

Do you even know what structured programming was? Structured programming was the revolutionary notion that you can code strictly by combining statements like if…then…else, do while …, begin…end or { … } in small functions to create readable maintainable code. This was controversial and revolutionary in the industry in the '70s; I was new then, and I remember the arguments over it. If you think tit was superfluous, perhaps you should try restricting yourself to writing a few monolithic applications in assembler and Fortran IV. Maintaining MLOC applications became feasible thanks to the widespread adoption of structured programming throughout the industry and its incorporation into all the languages which have become standards.

1975 - Jackson Structured Design

Still timely; besides pushing for the use of structured programming constructs, Jackson introduced the idea of a structured way to backtrack or handle failure in your code, via posit…quit. This ultimately evolved into modern exception handling structures. If you ever write try { … } catch( … ) {…} finally { … } you’re building on his work.

1990 - Object-oriented design

(BTW, Work on Smalltalk began in 1969, and was publicly released in 1980 so you’re off by about a decade here.)

Of course, object-orientation is a passing fad. Uh… you’re not by any chance writing in C# are you? Oh good. Hope you’re not using Java, C++, Ruby, Delphi/Object Pascal, Objective C, etc. either.

If you’ve used object-oriented languages for a while, you have probably absorbed some of the once controversial object-oriented design principles to where they seem second nature. Like structured programming, once you’ve soaked in them for a while, they seem trivial and obvious, but they weren’t 20-30 years ago.

Lumping these major advances in the industry together with relatively short-lived design methodologies is pointless for anything but trying to score cheap rhetorical tricks.

tit - that it. Sigh.

You fool yourself into thinking you are a professional because you don’t use VB and read a few blogs.

It’s hard to take you seriously when you haven’t even read enough of Jeff’s stuff to know that he is a proud VB programmer.

On the matter of KISS, I am thinking that might be a good compromise between bureaucracy and nothing at all.

If Jeremy (the teamlead) is not into reading the latest must-reads on software development than Jeremy is simply NOT THE RIGHT MAN FOR THE JOB.

The real decisionmakers of the company should know who to give the role of teamleads…