
"Calling oneself a C Programmer is like saying you're a Hammer Carpenter" - fogus
https://bbs.archlinux.org/viewtopic.php?pid=147321#p147321
======
jdietrich
The "programming language as tool" metaphor is terrible.

I don't have a clue how pointer arithmetic works. I'm vaguely aware of it, but
it just never comes up in my professional life. I'm absolutely fine with that,
just as I'm fine with the idea that a cardiac surgeon may be vaguely aware of
how to perform a kidney transplant but doesn't know the details.

Let's be realistic. The days of wizard programmers single-handedly designing
an operating system are gone. We're all specialists now. An embedded systems
programmer has absolutely no need to understand the intricacies of XML schema
or the finer points of CSS parser bugs. Beyond a broad sketch, I have no real
need to know the fine details of memory management.

I'm happy to call myself an ECMAScript programmer because that's what I do,
that's what I have done for some time and that is what I expect to do in the
future. I know other languages, though none well enough to produce work I
would be happy to put my name to (apart from Scheme, but who's going to hire
me to do that?). Like it or not, I'm not a computer scientist. I'm a working
programmer and my view of the world is inevitably coloured by the raw material
I work with every day. The way I think about code, the way I design problems
is an imprint of the capabilities and limitations of my usual languages. I
imagine a sufficiently literate computer scientist could smell it on my
breath, or at least infer it from the way I might sketch out a diagram or
pseudocode solution.

~~~
Kurtz79
Every average programmer with a passing knowledge of computer architecture
should be able to pick up pointer "arithmetic" in a couple of hours.

It's not rocket science, really, it has more to do with the "I don't know what
it is and I'm absolutely fine with that" kind of attitude.

As an electronic-engineer-turned-embedded-C-programmer I never had anything to
do (and likely will in the immediate future) with things like closures,
prototypal inheritance or web frameworks, but at least I should be able to
know what they are and the concepts they are based upon.

By willingly limit your toolbox to one tool you limit your possibilities and
usefulness. Maybe you'll come up with a problem that an other tool solves
better than the one you are used to, and you'll never know.

~~~
rick_2047
_By willingly limit your toolbox to one tool you limit your possibilities and
usefulness. Maybe you'll come up with a problem that an other tool solves
better than the one you are used to, and you'll never know._

Correct me if I am wrong, but any one of these "toolbox"es will take enormous
effort to master fully. Some person may really want to do web development for
his/her whole life, nothing wrong with that. But to do that they will have to
master many many skills to even say "I know everything about web development".

~~~
loup-vaillant
The core argument of phrakture is that the toolboxes are more complicated than
the underlying mechanism they hide. If he's right, learning them is worse than
useless.

Kurtz isn't talking about those. He's talking about basic knowledge about
programming. Even if he only does C, he at least has an escape hatch when he
needs more powerful thoughts than what C alone can give him.

~~~
jfb
This is one of my beefs with ORM -- in order to use the database layer
properly, you need to expose at least as much complexity as the database
itself provides. We use Sequel, which is fine as far as it goes, but it ships
with a stupid DSL that is a) as complex as SQL and b) significantly less
capable. You end up with shitass queries and many more database round trips
and for what? Method call syntax?

Sorry. Rant.

~~~
jarin
Speed of development. I know perfectly well how to write SQL, but I would
rather write "Post.where(:published => true).first.comments.count" and move on
to the next thing.

If I need to later on I can go back and write a raw SQL query, but why do it
unless I need to?

------
gfunk911
Yes, because that's all Rails (and the other frameworks) do. They obsfucate
HTML and put a thin wrapper around SQL

You always have the option of dropping down into straight HTML. This is one of
the things I love about Rails. Also, he forgot all the other things these
frameworks handle, which constitute 95% of what they do.

Yes, there are people out there who couldn't write straight HTML if they had
to, and have never heard of an inner join. We call them bad programmers. Guess
what: they're everywhere.

EDIT: Obviously this only applies to people who work in web development, or
other domains where SQL and HTML are important parts of their domain. If you
do low level systems development, write device drivers, do kernel development,
etc, you're not a bad programmer cause you don't know HTML.

~~~
RiderOfGiraffes
You'd call someone a bad programmer just because they can't write straight
HTML? You'd call someone a bad programmer just because they've never dealt
with databases?

Interesting.

~~~
donaq
Well, not HTML, but I would maintain that any programmer who hasn't dealt with
databases is either a newbie or a bad programmer. Any _web_ programmer who
can't write straight HTML is most definitely a bad one.

~~~
RiderOfGiraffes
OK, so I'm either a newbie or a bad programmer. I've been programming since
1978, so I guess I'm a bad programmer.

Hmm. I write safety-critical software for embedded processes and distributed
systems. Perhaps I should be concerned at your judgement.

~~~
donaq
I think you have misread me. And while my knee-jerk reaction was to meet snark
with snark, I shall resist the temptation. If none of your software has ever
read from or written to a source of persistent data, I think you _should_ be
concerned. :)

~~~
RiderOfGiraffes
My comment wasn't intended to be snarky, but when someone questions my
credentials, albeit inadvertantly and through ignorance, I find it a little
hard to be entirely objective.

I do read and write persistent data stores, I've just never had to use SQL or
a relational database. I've just gone and looked it up. I do know the concepts
of inner, outer, left and right joins, and I use similar constructions every
day.

But this is counter-productive. I've made my point that there are areas of
programming that don't use SQL or relational-databases or web technologies.
Making sweeping statements about the competence of programmers based on their
knowledge of technologies they don't use is blinkered.

Yes, programmers who work in web development most likely should know about
databases and HTML. If they don't, then they are most likely either
inexperienced or limited in their capabilities. It may yet be that the code
they write is clear, clean, well-designed and bug-free, but databases and HTML
are strongly correlated with productivity _in this field_.

~~~
donaq
_My comment wasn't intended to be snarky, but when someone questions my
credentials, albeit inadvertantly and through ignorance, I find it a little
hard to be entirely objective._

Huh. Well, you've been programming for longer than I've been alive, so you're
almost certainly a better programmer than I am.

~~~
RiderOfGiraffes
I suspect that largely we've been talking (arguing?) past each other. My point
was/is that there are areas of programming that really, really don't need SQL
or relational databases, and don't touch web interfaces. I've just been
talking with a friend who does financial simulations as well, and he's heard
of joins, but never used them. He's also never written HTML, but has got a
clue about it.

There are also many programmers out there who claim 30 years of experiences,
but who actually have 1 year of experience 30 times over.

At its heart I think we'd all agree that narrow definitions and narrow
judgements don't do anyone much good. There are more programmers than just web
programmers, or embedded programmers, or kernel programmers, or simulation
programmers, _etc._

We should all do each other the courtesy of recognising each others' skills
and knowledge.

~~~
donaq
We have definitely been talking past each other. Mostly because we understand
the term "database" differently (see my other reply to you). I am actually
mostly in agreement with you, since I don't do that much web development these
days either. And narrow judgements may not do anyone good, but I think precise
definitions would have helped us in this case. :)

~~~
hugh3
I've never done "database" stuff either, but I've "read from persistent data
sources" (Fortran formatted read ftw). But if I tried to claim this counted as
"database experience" on a job application I don't think many people would
agree.

------
promethean
That analogy only holds if you can build any object of a carpenter's skill
with just a hammer, or just a screw driver, etc. C is a general purpose tool,
compared to the task-oriented tools of carpentry.

There is a very strong difference in signal from someone telling me "I am an
expert C programmer" compared to "I am an expert PHP programmer."

Leaving out the name of the programming language all together removes salient
content without adding anything else of value. If I want to make your of your
programming skills, I'll still need to ask "Okay, what languages?"

So, saying that "Calling oneself a C Programmer is like saying you're a Hammer
Carpenter" is like saying when there is a choice between tool sets, the choice
doesn't matter.

~~~
demallien
Yup, programming languages are (generally) Turing-complete. Hammers are not
the equivalent in the woodworking space, good luck cutting that plank of wood
into two equal pieces, lengthwise, with a hammer.

Saying you're a C programmer is more like saying you're a carpenter
specialising in furniture, as opposed to say a carpenter that specialises in
houses.

~~~
pavel_lishin
> cutting that plank of wood into two equal pieces, lengthwise, with a hammer.

Sounds like one of those "round manhole" interview questions.

~~~
gchpaco
I think the solution to that one is to use a hammer to make a saw out of metal
and use it.

~~~
pavel_lishin
Build a forge. Construct a saw mold. Melt down the head of the hammer into the
mold. Meanwhile, carve notches into the handle to measure the board. After the
saw cools, find a rock to sharpen it with. Saw the wood in half.

This actually sounds like a process that's more fun than some work I've done
in the past.

------
generalk
I don't know many folks that call themselves "PHP programmers" or "Python
devs". I know a lot of "web developers" that know a bunch of technologies,
though. The few people I do know that are "$LANGUAGE developers" usually
aren't that good.

As far as frameworks go: I use frameworks because I don't want to re-write the
same shit over and over again. Yes, I can write an <a> tag, and I can do
complex JOINs. Now I use Haml and ActiveRecord so I don't have to spend time
hand-crafting every SQL statement I need.

I've never understood the whole "frameworks bad" ideology. Just because some
folks don't learn anything outside of their framework doesn't mean all
frameworks are bad. (See: US Supreme Court, Baby v. Bathwater)

~~~
joelmichael
I identify as a Rails developer out of expedience. It is what I've worked in
for the last five years or so, and where most of my marketable proficiency
lies. You could call it my specialization. I know PHP, C, Java, Perl, and
others, but why mention them? I haven't used them for work in years.

------
llimllib
Carpentry metaphors for programming continue to suck: news at 11.

~~~
netcan
Not doing C is like a carpenter not using a hammer?

Programming languages are like hammers in that they often end up in metaphors.

Hammers are like C in that they are bad metaphors for women.

~~~
llimllib
Bravo.

------
parfe
Meh, I hate analogies with a passion, but here's my useless rewrite:

Calling yourself an Emacs Programmer is like saying you're a Hammer Carpenter.

Calling yourself a C programmer is like saying you're a framer. Calling
yourself a Ruby developer is like saying you're a brick layer.

Both can be used to build a house and it's usually better to work with what
you know.

------
grovulent
So I'm a newbie python/django person that has been using them both for about 6
months now. I've had multiple rants directed my way by web developers telling
me that I was making a big mistake by using a framework - for all the sorts of
reasons listed in this rant.

So apparently I'm ruining the universe by employing tools I don't fully
understand. I must admit this particular complaint I find a bit perplexing.
I'll drop down a level of abstraction if I find the universe demands it of me.
Otherwise - I really don't care about what's going on in bowels beneath me.
Maybe Gandalf is getting it on with a Balrog for all I know... but for my
needs, it just doesn't matter.

I mean - I'll learn assembler if I come up against a use case that demands it
of me. But that's just not likely to happen for the silly little things I'm
working on.

I also happen to believe that it's a waste of time to teach kids the algorithm
that you work through on paper for long division. Give the tykes a calculator
and let society progress at the faster pace that technology allows. I mean -
claiming that you need to use an abacas to do basic sums because that's how we
old folk did it, is just ridiculous. All algorithms are just effective
procedures which depend on a certain level of technological sophistication to
be employed. The introduction of arabic numerals meant that we didn't have to
use abacuses any more. Hooray!

Besides that - I actually know people whose applications I have aped for
learning purposes - and I notice that I wrote them in about the tenth of the
time, with less than a tenth of the experience, and they also seem to the run
at ten times the speed with similar functionality. I hear yarns about how they
were doing dumb things like not setting primary keys, or making loads of
unnecessary calls on the database etc... and I think about how Django really
helps me to steer clear of many of the basic mistakes. I learn about these as
I go because I continue to read the awesome documentation as well as digging
into the guts of how Django works. Through this I get a lesson on how at least
one group of professionals think web development should be done.

I personally feel much better placed going forward than all the folks who've
had to roll their own over the past 10 years. When I feel more comfortable
with Django, probably the next thing I'll do is learn another framework - so
as to get another perspective from the professionals.

I think it's a great way to learn - personally... and folks who think
otherwise I'm going to keep ignoring.

~~~
TheSOB88
You don't think it's important for people to learn long division? Other than
being one step away from total technological reliance, these kinds of
exercises are way of _teaching the relationships between numbers_ , which is
INCREDIBLY important.

~~~
ewjordan
Bah. Long division is a rather unenlightening algorithm that doesn't teach
most people anything _at all_ about how numbers interact.

That's assuming they even remember how the algorithm works. Which they don't,
as a rule.

ROI-wise, there are _far_ better places to spend time learning the
relationships between numbers than long division.

------
davidw
My inclination is to believe that knowing the basics of writing code with C is
slightly more difficult than figuring out the basics of hammer usage.

Also, the range of things you can do with C likely exceeds what you generally
utilize a given hammer for.

Programming languages are not like hand tools.

~~~
Untitled
I'm going to go off at a tangent here and rant a bit.

Firstly, "C" is not a difficult language. When you compare it to the
difficulty of say elementary calculus, you will notice that the concepts are
simple.

Any person who studied computer science and do not know how a pointer works
(or how to represent an access an array with a pointer) is grossly
incompetent. C does not hide the basic programming concepts behind a nice IDE
which you double click to type your portion of code.

I recently had another problem (with one person who was busy with a Masters
degree at a fairly prestigious technology university). The project involved
having video updates. I wrote a demonstration that performed the computation
in a “while(1)” loop (i.e. fetch frame, do processing, display frame). The
person was involved in writing a simple GUI program.

I tried to explain to him that he cannot use a “while (1)” loop in the event
handler of the button that should start the event. Even drew nice graphs on a
board explaining all about the thread of execution and how event handling
usually works (e.g. a loop that handles events and call functions).

After 30 minutes of explanation the person came up with a very bright idea. He
said that “Maybe we should set a sleep(1000) command in the loop to give the
program time to react”. WTF?

~~~
kenjackson
I don't understand... don't you get a "ButtonClickedEvent" when the button is
clicked? Why would he think he needs a while(1) loop in the button? Am I
missing something?

UPDATE: After rereading it... you guys are actually implmenting the button.
Although surely you're not implementing the whole mouse stack... so I'm still
confused :-)

~~~
wmil
I think the guy copied the video processing loop into the event handler.

So the event handler goes into a while(1) loop instead of starting a new
thread/process to do the video processing.

That will lock the GUI and make the app unusable.

~~~
kenjackson
OK, so from looking at the code, only DrawNow needs to be on the UI thread
(unless DrawNow is actually not drawing to the screen). That makes sense.

One thing to note though, the grad student may not be familiar with a model
where UI is on a specific thread. I know some of the past systems I used had
the rental model (even WPF had it early on), so maybe, giving him the benefit
of the doubt... this is what he was thinking about (and assumed you had
acquired all the correct locks in your code)?

------
patio11
The real danger isn't calling yourself a C programmer, it is calling yourself
a programmer. That has far more dangerous career consequences, particularly
for freelancers.

~~~
AndyKelley
You need to explain that for it to make any sense.

~~~
patio11
If you call yourself a programmer, sell yourself to management as a
programmer, and go about getting jobs by applying for the ones that say
programmer in the title, you are boxing yourself in to a career role as a
lumpen resource (literally, they will call you a "resource") and cost center,
which the MBAs are going to do their level best to either eliminate or replace
with a substitutable resource at a quarter of the price. That resource might
be a younger resource, or it might be a resource with an accent, but either
way they'll check your department's resource box.

Instead, you want -- particularly as a consultant -- to be the guy giving
measurable, predictable, huge impacts either to costs or, ideally, to driving
revenue. If you cannot quantify your worth to the company, _it will be
quantified for you_ , and the default guess is going to be -1.5 *
$YOUR_SALARY. If you _can_ quantify the value of your work for the company --
by being the guy who makes them money using his bag of magic tricks that
management frankly does not understand and _does not give a shit about_ \--
your market value will be far, far higher, whether you choose to take it in
terms of dollars, flexibility, working conditions, or what have you.

~~~
alextgordon
If you accept a job that requires such mindless bullshit, then you're going to
get constant mindless bullshit in return, no matter what kind of pretense you
cook up. The only winning move is not to play.

~~~
dasil003
Gotta disagree on this one. This is all about the higher-ups' opinion of you.
In most businesses technology is not a competitive advantage, and the brass
doesn't understand how it could be; they just use industry-standard templates
for applying technology. If you come in as someone whose job it is purely to
implement such a template then you are simply a replaceable cog, no different
than the 20 bookkeepers that the new accounting system replaced.

On the other hand, if you come in able to really talk about the business and
offer solutions at the level of upper management, then your value will be much
more obvious to the people who matter.

------
codefisher
He forgets what the main purpose of frameworks are for, doing all the boring
repetitive bits, so I can get down to writing the new and interesting parts of
my web app. For example doing form validation, and displaying the errors back
again is really common, and annoying. Any good framework makes it painless.

And what about running on multiple databases. What happens if I need to be
able to support MySql and Postgres? Really hard without a framework.

~~~
sz
Exactly. Pain in the ass does not imply hard to understand.

------
apl
I like Django as much as the next guy, but the framework-obsession that has
developed over the past few years does indeed tick me off.

There are certain instances (i.e., full-blown web applications) that benefit a
lot from employing abstraction tools such as RoR or Django. Equally, whenever
there's a lot of variation in the underlying technology, give me a framework!
jQuery is a wonderful example for this.

However, there's a time and place for such frameworks, and that is not
"always, everywhere". Really simple CRUD stuff doesn't require Rails. CSS grid
frameworks are a ridiculously inefficient mess. (Aye; even in prototyping.)
Most template languages are silly and unnecessary. Et cetera.

Sure, it's a rant. But the man has a point. Web frameworks are enabling a
whole generation who can't even use a scripting language without relying on
plenty of magic. A modicum of abstraction, when sensible? Bring it on.
Relentless black box programming? That has its limits.

~~~
lulin
"Web frameworks are enabling a whole generation who can't even use a scripting
language without relying on plenty of magic."

I don't really think people program like this. When I tried using rails 2
years ago, all the magic it was doing behind the scenes actually made it
impossible for me to use it, as I had no idea what magic was there and how it
related to the underlying system. After some time of writing web apps "by
hand", then trying out sinatra and padrino, I just recently looked at Rails
again and suddenly understood how to use it.

What I want to say is that I don't think that the magic Rails does leads to
stupid programmers. It will only help those that actually know what they want
to do and make the repetitive parts easier. Honestly, I don't want to write a
login system with hashing etc. ever again. I don't want to think about how to
save old versions of the entries in the database. I don't want to write my own
form helpers. I am happy that Rails does this for me and I can spend time
thinking about the interesting parts of my program.

------
StavrosK
That entire comment is very biased. Sure, the "pure" way might be amazing and
fantastic, but if I used raw SQL queries for my projects, I'd be in a _lot_ of
trouble when I needed to do something extra when saving an object.

Sure, I could use stored procedures, but then it's database-specific. What
happens when I need to move from MySQL to postgres, or from AppEngine to my
own server?

The poster just ignores a million things frameworks are good for. Sure, if
your project is large enough you'll eventually grow out of them and need to do
more complicated stuff than what they make simple, but for 90% of projects
they are a godsend.

------
jrockway
Reading forums where PHP Programmers hang out and ask about other langauges is
like hitting yourself on the head with a Carpenter's Hammer.

------
xentronium
"Non-transferable API knowledge" sometimes saves a lot of time you'd otherwise
spend debugging your newly invented low-level hexagon-shaped wheel.

~~~
jgrahamc
Agreed. But the big problem with RoR that I've encountered is that the whole
has_and_belongs_to_many mess feels like an idea that got out of hand. You can
imagine that with a very simple schema writing the associations would be easy
enough, but you end up with two problems:

1\. You have to keep the schema and the associations in sync. I simply do not
understand why in RoR the associations are not derived from the schema using
foreign key relationships.

2\. You end up knowing how to do something simply in SQL and then having to
translate that on to the Rails way. This Rails way seems like a useless
translation of a perfectly workable underlying system.

Put 1 and 2 together and I end up with the frustration of "Oh, I have to keep
the schema in sync. with all this association stuff so that I can use Rails
method to access the schema". It feels circular and I'd be much happier with
reverse engineered methods.

Also, I find the Rails magic functions where you can just make up a function
name find_by_nozzle_color() to be infuriating. I'd be really happy if the
reverse engineering component spat out something like a header file containing
sensible methods I can call.

Perhaps I lack imagination. Or experience. Or both.

Also, while I'm moaning. I wish Rails had proper support for database views.
It's as if no one has any real experience with databases. Doing that would
eliminate a lot of my troubles because I could keep a view (even an updateable
view) in the schema and have a handy object accessor for it.

~~~
gaius
In all these frameworks, there's probably one guy who learnt a bit of SQL and
thought "this is too complicated for anyone but a programming god like me" and
built a Rube Goldberg abstraction layer on top of it. There's just no need for
an "ORM layer" if you understand that a table is NOT a class and a row is NOT
an object, and you can't fake it except by jumping through a lot of entirely
unnecessary hoops and what do you get for that? A app that is 1% more "object
oriented" than it would have been if you'd just done it.

~~~
jgrahamc
That's a good point about the mapping of a row to an object. I've always found
that whole "table is class" but "row is object of same class" thing weird.
It's like the people who created these things don't understand objects either.
Would have killed people to have a row class and a table class (perhaps with
iterators)?

~~~
swombat
Rails takes a very clear and opinionated view that the database is just a dumb
storage layer for the application code, which sits in the application layer.

If you have very strong feelings against this view, I suggest you stay away
from Rails. If you can adjust to it, though, Rails is very powerful, flexible,
and efficient.

~~~
matt_yoho
This isn't really true, particularly with Rails 3. If you don't want to use
the ActiveRecord database patter, don't use the default ActiveRecord ORM that
ships with Rails. Drop in DataMapper instead, and use whatever pattern you
wish.

Rails != ActiveRecord these days.

------
endergen
I agree with this point for sure. Frameworks are great if you are going to
leverage a lot of the libraries/modules. But often in practice you never do.
So then you end up taking on the issues with using a large codebase. Which is
that when you find a bug, it's very hard to trace through code to figure out
what's going on.

You are investing in learning a specific library/framework rather than the low
level details that are on average what you'll need more because in practice
you don't get to use the same framework all the time if you switch companies
or projects as they tend to have entirely different frameworks or even
languages on the backend.

I like how Marcin Wichiary though in this ajaxian.com article:
[http://ajaxian.com/archives/web-ninja-interview-marcin-
wicha...](http://ajaxian.com/archives/web-ninja-interview-marcin-wichary-
creator-of-google-pacman-logo-html5-slide-deck-and-more)

He basically builds all his libraries from scratch for each project which he
can do quickly because he knows what he's doing and can of course leverage his
other code for reference. Each iteration simplifies what turns out to be
bloated and creates a new code base more matched to the problem he's trying to
solve.

------
jdvolz
Actually, I would have characterized this more as:

"Calling oneself a C programmer is like saying you're a finish carpenter."

As in, it means you normally work in a particular set of circumstances, which
is all we're aiming to say when we denote the language we work in (because
language is often closely allied with the type of project). Does it define you
as a person, or even state that you don't work in other types of projects, no,
it doesn't.

Can we move on from this now?

------
promethean
Reducing this analogy, you obtain the simplest form of "C is like a Hammer". I
really want that hammer. With it I could as easily manipulate the molecules in
the wood I'm hammering as I could secure the roof to the frame of a house.

Buffer overflows would be a problem of course, at least for large buildings
with lots of traffic-- after the 4,294,967,296th person the whole thing would
just collapse.

------
billswift
I think "machinist" is a better analogy than carpenter for programming. A C
programmer is like being a lathe operator, a ruby programmer like a milling
machine operator, and so on. And the various frameworks and APIs are like jigs
and fixtures, they let you turn out some work more quickly and accurately, at
the cost of overall flexibility.

~~~
rmjb
You're implying that C akin to a lathe and ruby is akin to a milling machine.
AFAIK, lathes do come with an optional milling attachment, while milling
machines don't have a lathe attachment. Thus C > Ruby ? ;) After a certain
point all analogies are flawed.

------
SeanDav
The Arch Overlord has a point but he has chosen to make a stand on an issue
that is shades of Grey and not Black or White. At the end of the day
abstraction can be very useful, even if you don't understand the underlying
technology, depending on what problem is trying to be solved.

Today it might be useful to do SQL queries and Form handling via OO and
tomorrow it might be more useful to go hack some raw HTML. The answer is,
almost as always, "it depends".

One could take his argument to ridiculous levels and say if you don't fully
understand Machine Code and every layer of Abstraction above it, you are doing
something wrong. Clearly a ridiculous argument although I have no doubt that
if you did understand all these layers you probably could safetly call
yourself a good programmer :)

~~~
techiferous
"make a stand on an issue that is shades of Grey and not Black or White"

There is much more of this type of discourse in the programming community than
I can bear. I think it happens when a young programmer gets just enough
experience to gain confidence but not enough experience to gain perspective.

------
alttab
The author may not have as much experience on a large web project as using
something like RoR would help with, but even so I generally agree with him.

Specifically speaking, what made me a better programmer was making my own game
engines from scratch using DirectX, SDL, and OpenGL. Yup, I wrote 3 different
engines on three different technologies (even though SDL uses DirectDraw
underneath). What made me a better web developer was writing my own MVC
framework for PHP, and then I moved to Rails to be productive.

Hiding those details helps certainly, but only if you know them. You still
need to know them, which is where a lot of Rails programmers get it wrong, but
hiding it will still help you be productive.

------
michaelchisari
I couldn't agree with this rant more. I use frameworks because they streamline
my code, and provide basic abstractions for simple tasks. One of my biggest
issues with Rails (to be fair, it's more about people new to rails), is the
way it sees abstraction as a form of magic. Simple tasks should be abstracted,
but abstracting complex tasks is a recipe for disaster down the line, when you
need to operate outside of the confines of the abstraction. This can be mind-
numbinglyannoying for experienced programmers, and frustrating for new
programmers.

I do want to address specifically the idea of abstracting out things like HTML
or SQL. These are my two pet peeves. I look at something like HAML, and I
can't understand why anyone would consider that to be a good idea, even
putting aside the fact that your designer will have to learn a whole new
syntax, but the idea that markup should look like programming language defeats
the point of a markup language.

Here's how I did it with Appleseed, using the simple_html_dom library. Views
are dumb, very dumb. You create a view which is only markup, for instance:

[http://github.com/appleseedproj/appleseed/blob/master/compon...](http://github.com/appleseedproj/appleseed/blob/master/components/friends/views/friends.php)

So you properly class and id your markup, and in the controller, you populate
the data, repeating elements for lists or tables, by targetting the dom.

If I want to set the title on this view, I do:

 _$View = $this- >GetView ( 'friends');

$View->Find ( '.profile-friends-title', 0 )->innertext = "New Title";_

That's it. No template pseudo-code, designers only have to care about the
markup itself. On the front-end, I do the same with Javascript. Think of it as
unobtrusive PHP.

I also stay away from ORM's. I understand all the arguments in favor, but in
the end, I'd much prefer writing complex joins than using an ORM.

Separation of concerns is so important, and yet, sometimes I think frameworks,
which are supposed to facilitate that, actually can make it worse, by trying
to reinvent the wheel in abstract ways.

------
xutopia
The analogy fails. Have you ever seen a carpenter never ever use a hammer?
They have to use it as some point but I've seen many successful programmers
never use C in their life.

------
jcromartie
All of these fancy web frameworks like Sinatra Web.py and Compojure are making
us soft. The abstractions that they hide are simpler than these frameworks.
HTTP is easy.

------
uxp
I view ORM and MVC frameworks like a stepping stone. I first started
programming using these wrappers/layers because it was simple to use. I was
able to get the same data I could have if I statically programmed SQL queries
onto my code, and I didn't care if I executed 1 or 50 queries for each page
that loaded. Who cares if SomeGuyJoe's site does this. If what his site does
works, who cares how it is done.

When I decided I wanted to learn more, I started to learn what the
abstractions did, and hacked and changed it to be better for my particular
use. Then I moved on to lower level languages, and now I have a decent
understanding of how to write my own abstractions, yet I still use
abstractions because they let me focus more on what I am wanting to do,
instead of how to do the things that let me do it.

This post could be changed to say that anyone that learns a higher level
language is harming themselves. The skills and syntax you learn from Python
cannot be used in C# or Java, so you should just learn assembly. It is all
machine code in the end and these languages are just facades. Only real men
program by moving bits to registers.

------
injekt
I don't get it. Using these frameworks has nothing to do with the user either
not being able to write markup, or just generally sucking at doing so. The
abstraction isn't 'useless'. It gives you a choice, though. If someone is
feeling more comfortable writing raw SQL then do so, ActiveRecord isn't
stopping you. That's the great thing about Rails. If you want to write raw
markup, sure, go ahead; just don't use any of the helpers provided.

Regardless of the means of transport, we're achieving the same goal. How we
achieve this is usually personal preference. And for that reason rants like
this will always come and go, just as responses like mine.

------
meric
I like my template language, it lets me write less repeating HTML. I like my
SQL wrapper and migration tool, it lets me change the database without
worrying about doing the wrong ALTER TABLE. And I like my automatic form
validation, its just much less annoying with it than without. If you know all
the tools I'm talking, then they are merely abstractions you'd build anyway if
you were using no frameworks!

The details beneath the abstractions are indeed simple, and likely more simple
than the abstractions themselves.

Why do we use abstractions if they are so goddamn complicated?

You know the answer.

------
Goladus
Calling yourself a C Programmer isn't anything like saying you're a hammer
carpenter. The analogy breaks down so quickly I don't know where to begin.
Maybe here:

 _A programming language is a tool. Each one fits it's own problem-set._

And what would that "problem-set" be, exactly?

The boundaries between the utility of a hammer and utility of a saw are quite
clear. The boundaries between the utility of PHP and Ruby are very blurry.
Strictly speaking, both languages are turing-complete and are equally capable
of solving the same "problem-sets".

------
Luyt
That article is from 2006. Somewhere the Arch Overlord states: _"CherryPy is
more restrictive than web.py - web.py uses the RoR Routes technique (I think
Django does too)"_ , but nowadays CherryPy has a 'RoutesDispatcher' too, among
other types of dispatchers, which can be chained.
[http://docs.cherrypy.org/dev/refman/dispatch.html#cherrypy._...](http://docs.cherrypy.org/dev/refman/dispatch.html#cherrypy._cpdispatch.RoutesDispatcher)

------
ubernostrum
You only get to write this rant if you built your computer yourself, smelting
the metal and crafting the circuits by hand, without recourse to off-the-shelf
parts, and then wrote every bit of code for it on your own, from the lowest-
level drivers to the highest-level interfaces.

And for bonus points, you have to use it by toggling ones and zeroes manually,
since all those wrappers hide things and get in your way.

------
AndyKelley
I used to make all my websites in pure Perl, and got along ok. When I
discovered web frameworks (specifically Django), I just about pissed myself. I
hate needless abstractions as much as the next guy (more, probably), but I
strongly believe that web frameworks will make a programmer orders of
magnitude more productive.

~~~
vrode
needless?

------
stevenwei
In my experience, the only people who actually prefer writing web apps in raw
SQL/HTML either 1) have never written a real web app or 2) tend to write
highly insecure code without even realizing it.

A few things that web frameworks/libraries help with:

Forms:

    
    
      - Validation & displaying errors & input sanitization.
      - CSRF checks.
      - Safe file upload handling.
      - HTML generation is useful for removing a bunch of boilerplate.
    

ORMs:

    
    
      - Default SQL injection protection.
      - Query objects help you construct complex queries without having to do a bunch of 
      string manipulation.
      - Database abstraction (e.g. moving from MySQL to PostgreSQL is a lot easier).
      - Database migration tools to help you upgrade your schema.
    

Templates:

    
    
      - Inheritance & replaceable blocks reduce a lot of boilerplate code.
      - Tools to help you safely escape user generated content & transform it for web 
      presentation.
      

Misc:

    
    
      - User authentication. Rolling a secure implementation on your own is no small task.
      - Secure cookie and session management.
      - Providing an organized architecture with sensible separation of concerns.
      

Now, to be a solid web developer I agree that at some point you're really
going to need to understand the fundamentals of how each of these things works
under the hood, but you're _crazy_ if you'd rather write all that code by hand
instead of using solid, well-tested, existing libraries for it.

Note: That's not to say that using a web framework will automatically make
your code secure (the recent Diaspora debacle clearly demonstrates otherwise).
However, you've already got so much code to worry about securing _in your own
application_ , why would you want to have to hand roll everything else too?

------
reynolds
These types of rants always strike me as being ignorant. It seems like it's
just taking this one person's view of software development and trying to apply
it to everything. To me, it's on the same level as saying "real programmers
use X".

------
igrekel
The title was promising but I found the point of the post moot. The title made
me think about the fact that a large segment of the market tends to categorize
developers on the tools they use rather than the things they build.

------
coliveira
I agree that web frameworks make things more complicated than they really are.
In other words, they make things simple in the beginning (when you are
creating the project), but they get more and more complicated when you try to
customize the application.

Despite all the problems with PHP, it still gives you a middle of the road
approach. You have all the tools to do the stuff you need to do, but at the
same time you have access at how things really are done. For example, you can
handle SQL by hand or create your own objects to do what is necessary. I think
this is really useful, and would like to have something like this in other
languages as well. I realize, however, that the reason PHP allows this
operation mode is that it was created as a web language itself, not a set of
libraries on top of an existing language.

------
abalashov
_I got news for you.... these "details" that are hidden, they're less
complicated than these frameworks._

Amen. Insight of the century with regard to Rails, J2EE, BPEL, and a number of
other boondoggles.

------
Kurtz79
It should be something obvious: a language is just a tool, and a good
programmer should be able to adapt and learn to use a similar tool in little
time.

A pity that for many in HR it´s not that obvious.

~~~
rimantas
Alas, in most cases learning the language is nothing compared to learning and
mastering the libraries. And then there is domain knowledge. HTML and CSS can
be very easy if you ignore browsers, their rendering modes, accessibility
requirements, etc.

------
greendot
If you were a carpenter and all you used was a hammer then it would make sense
to call yourself a "Hammer Carpenter" to distinguish yourself from other well-
rounded carpenters.

------
vineet7kumar
Sure it's easy to get hurt if you do not use a hammer with care but you just
can't be a good carpenter without knowing how to use a hammer properly . NOM

------
cmelbye
I can drop down to plain HTML without using any Rails helpers, and I can also
use standard SQL for queries in ActiveRecord. This is probably the case for
most other frameworks as well.

------
gills
I think it's more like wearing hammer pants.

------
vrode
What if I wrote the wrapper myself?

------
zafka
I am an Information manipulator. I happen to be very fond of using C. I
sometimes just use my fingers.

------
ethyreal
I love that a four year old programming rant is still poignant.

------
konad
I, for one, welcome our new Arch Overlord.

I kind of agree with him. But I bet he wrapped his "select count(*) from ..."
in some sort of function like get_row_count(table). Add a few more and before
you know it, you're half way to a new framework that concatentates HTML
fragments built from SQL queries.

------
binaryfinery
Perhaps people call themselves a C programmer because they are advertising
their skills for a job. Calling themselves "a programmer" might find them
getting less jobs.

But to assume the argument has merit, lets follow it to its natural
conclusions: since when was SQL a low level language?! SQL servers are vastly
more complicated than Rails.

Another assumption the author makes is that, for any programmer, SQL is the
constant, and time spent learning Rails is wasted if one has to switch to
Django. This just shows the limited world view of the author. For many, Rails
is the constant, and SQL, Couch, or Mongo are the choices.

To stick with the tool analogy, C is the giant processing equipment that
skilled operators used to print my photos in an hour (<http://bit.ly/aCoA0K>),
while Rails is the little Canon Selphy sitting on my desk. Both produce
identical results. One of them does it a lot faster, for a lot less money, and
a lot less failures and maintenance.

------
9ec4c12949a4f3
Calling oneself a C programmer is like saying you work with wood but not
metal.

Fify?

------
bhiggins
a web programmer should perhaps not speak of things he does not understand

------
jayF88
c is god

