Discussion Locked

Critical Thinking

0 helpful
586 replies
Closed to new repliesThis discussion is closed. It stays readable, but it takes no new replies.

This is page 3 of the discussion. Read the opening post

586 replies

by khushil.dep

Well - those five kids will learn a great deal, be directed by others
who know more and develop and application that can be adapted by anyone
who sees fit to do anything they so wish. The crust old timers will pat
themselves on the back and wonder off down the happy road of oblivion
whilst the users suffer another BSOD and more work lost.

"IIS is a significantly more ambitious piece of software than
Apache" - you mean its got more bugs in right? Has the idea of software
modularity died or someting? Do something really well. Don't do
everyhing badly.

The whole point of Open Source means that when something goes wrong it
can be fixed quicker by more brains.  It means companies can't
hold others to ransom - nor jepordise other businesses by their
inaction.

It's about an ethos of getting everyone pitching and sharing the load
and the glory.  The cult of self worship that closed source coders
get into is really sad.  Genius is one idea - it means standing on
the shoulders of giants. Giants who give you a leg up.
 

by glen.greaves

Open Source is not some sort of training program for coders. The argument here should be is open source a better modle for developing software than close source model. Which is better 5 coding experts or 50 coding experts pooring over code? From a close source point of view it is cheaper to employ 5 than than 50. However wouldn't the closed source model lose the knowledge and experience of the 45 experts not involved? Open Source will always be the best model for developing software.Demand for certain types of software will always dictate where the coders go. If your package hits millions of desktop users, then you are on to a winner. Do closed source projects of no value get any attention? Let me provide one simple example. Anyone heard of Valadeo Technology Corp and a great product called LiveSite (web design and content management software)? Don't bother looking it up. They have long since disappeared, and with them LiveSite which was miles ahead of any offering from Microsoft, Adobe and Macromedia (before the buy out). What are the chances of that happening to Apache....?

by justin james

This is the second of a three part series regarding how to think like a programmer.

In my last blog (How to Think Like a Programmer: Part 1), I discussed how education, particularly a strong background in mathematics, is crucial to being a great progrommer. In this post, I will go over some of the things that I have found extremely helpful in my personal development.

The number one most useful experience in my learning process was EdScheme. Never heard of it? Sounds vaguely familiar? Well, it might sound familiar because of the word "Scheme," a language in the Lisp family. You probably have never heard of it because it is pretty much useless. That is the point of EdScheme. The EdScheme language has only a few built-in functions (less than twenty, if memory serves), and no libraries that I am aware of. Working with the EdScheme books, you slowly build a much more full featured language out of the meager tools you are given. In the process, you are taught a lot about things like recursion, efficiency, and the idea that there is usually more than one way to skin a cat. One example that still sticks out in my mind was building a simple string reversal function. My memory of this is all very hazy, but I seem to remember that we did not even have strings at first; just arrays, chars, integers, and a floating point type. As we progressed through the course, we kept building on our previous projects. Problems and inefficiencies which were not found in the early work were soon uncovered as we progressed through the course.

What this experience taught me was how to break a problem down to its most simple form, an Occam's razor of programmatic thought. Ever since then, I have been much better at looking at a problem and ask myself, "what is the simplest way of making this work?" All too often, programmers find solutions that are incredibly inelegant, simply because it uses methods and tools that they are already familiar with. Programmers should not code for the sake of writing many lines of code, they do not get paid by the subroutine ala Charles Dickens. They get paid to create solutions that meet the why of the users. Anything more than that is simply hubris. Developers are not their own customers. The EdScheme experience showed me that achieving workable, maintainable, and excellent solutions was paramount; the pride of kludging impossible solutions out of inadequate parts never enters the equation.

Another experience which has helped me expand my awareness of good programming is the Perl language. Perl is the most elegant language I have ever used. There is something very satisfying about writing one line of code that does what another language might take five, or ten lines to accomplish. Some time ago, I re-wrote the Perl SoundEx CPAN module as a VB.Net class. The differences in how the code was written were astounding. I was not just that Perl has regex's built in as a string operator and VB.Net requires a regex object. It was the entire attitude of the two languages. Writing in VB.Net is like talking to a four year old; programming in Perl is like talking to an adult. Yes, Perl code can quickly devolve into an unreadable mess, especially by overuse of the implicit operators. And yes, Perl has quite a number of contradictions and inconsistencies. But the Perl language is so incredibly instructive and powerful. In 2000 or so, I wrote a piece of shopping cart software. In 1,609 lines of code (including whitespace, comments, etc.) I was able to pack in a flat file database system (this was before every web host came with MySQL), a full templating system that I consider to be better and more powerful than PHP's (this was before every web host came with PHP), the actual shopping cart system, session handlers (you could not count on the CGI module being installed), error logging, the whole nine yards. It even had a module system for rapidly constructing plugins. Admittedly, it lacked an online administration system; I also believe that it was simply enough to use to not need one. Like EdScheme, I found myself writing my own, custom tailored versions of code in order to handle things which most programmers take for granted, because one design specification was that the only requirements were FTP access and Perl 5.

To get a deeper appreciation for well written code, I highly suggest that you find an open source project that is not a "big player" and try modifying it and customizing it for your own use. Recently, I was working with ZenCart. Out of the box, the software itself is fine. But my customer had extremely demanding needs, and "out of the box" was not nearly enough. I had to go extensively into the code, to the point of modifying its base functionality. I was horrified. The code looked like the worst examples from Computer Science 101. There were nested loops with iterations like "m," "n," and "o." There was little consistency in variable naming. And so on and so on. The code itself was fine on a functional level. But it was so unreadable that sometimes even minor changes would take hours just to find the right place to make the code change. That reinforced in my mind the need to develop a programming style and stick to it. I have a different style for every language I use. But I stay consistent within a language, to the point where I can copy and paste code from one project to another with little (usually no) modification needed. Small things, like always naming my iterators the same thing make a world of difference; someone who sees what a particular variable does in one function immediately knows what it will be doing in a completely separate function in another part of the code, even another program that I wrote. It is especially important for teams of programmers to develop a common style and stick to it.

Finally, I recommend that you get your hands on a variety of different languages, and try writing the same small project in each one. You will quickly learn what works and what does not, for each language. Most programs, at the end of the day, are essentially CRUD mechanisms; get data from somewhere, present it somewhere, allow some changes to be made, and put the changes back into the data source. Some languages are better at this that others. The .Net languages, for example, are outstandingly pleasant to use for straight database-to-screen-and-back functionality. But try to do anything with that data programmatically, and the serious shortcomings of Visual Basic and C# become quite clear. They are weak languages, incapable of doing too much without the giant .Net Framework behind them. Java is about the same. Perl is an incredibly strong language for performing processing, particularly of text, but its systems for getting data to and from the user leaves much to be desired. Its roots as a procedural language make it less than fun to develop user interfaces with it on the backend. And so on. As you learn more languages, you also have the opportunity to see how things can be done. The more tools in your toolbox, the more likely you will be to use the right one for the task.

I know that there is a lot more to be added to this list. Really what I want to make clear is this: always expand your borders, never cease learning, and do not get too attached to any one language or methodology. Learn what works in what situations, and you will be able to meet any challenge.

J.Ja

This is the second of a three part series regarding how to think like a programmer. Part one discussed the reason why mathematics skills are important to the code writing process. In the third part, I will cover the difference between shot term expediency and long term solutions.

by rhomp20029

Insert comment text hereWhile I agree with a lot of what you are saying I do feel that you have left out the most important part of the process.  Anything you program has at some point got to have a human interface.  Unless you can understand what humans will do with the code you have programmed and taken that enough into account to see to it that you forestall their screwing up the process, then no matter how wonderful your solution is it will be meaningless.  

I had this problem years ago.  My boss got a contract to implement a system that was designed by someone else who had theoretically interviewed the clients and got their signoff on the whole design.  My job was to program what he designed, a task that i did and finished ahead of schedule.  I showed it to the IT person at the client and she was fine with it, thought it did exactly what it was supposed to do.  Then we took it to the user to show them how it worked and get their signoff.  Turns out that the designer had totally misinterpreted her needs and what he designed was totally out of the ballpark for what was needed.  I ended up having to not only redesing everything he did but then I also then had to reprogram everything I had done.  The whole problem was because the end user was not included in the process all along the way and that is the problem I have with your description of how to be a good programmer.

I think that the programmer needs to be able to write good code that does the job.  I also think that the programmer needs to be able to visualize the whole problem from the micro to the maxi and also be enough of a psychologist to see what the users can do and will do and preclude their screwing up the solution.  He also needs to be able to write good, efficient code that allows a natural progression of the process for the user or the user will misuse the soltuion and screw up the files.  That is the part that I see missing and it is a part that I see missing in alot of the work that I saw being produced in my 40+ years in the field.  All too often the programmer was very proficient at mathematics and science and totally out of the loop on how people interact and work.  You need both parts of this equation to make the solution not only efficient but useful, usable and people-friendly.

by justin james

Rhomp -

Those are excellent points, why I have gone over extensively already. Check out my posts from April 2006 and March 2006. Unfortunately, TechRepublic does not seem to offer a permalink to the idividual articles, so I cannot put a "quick picks" here for you. This particular series focuses on the mental process of writing code in and of itself. The earlier writing were about the interactions between the developer and the user.

J.Ja

by srarden

I have to say that as I read your posts, I sometimes find myself infuriated as I think to myself 'How dare he pick on the way I code!  I work hard I'm smart! I try!!!!'

By the time I am done reading a post, I have gotten more material to REALLY think about than I do at all but a couple of other sources.

I will never be at the level of programming that your posts make it clear programmers should be, but I will be closer to it, if for no other reason than you make me examine why I take the easy way out and code without thinking first.

So, you tick me off.  And thank you! :)

by jamie

I can't agree with you more. I have been in situations where management has allowed programmers to use something that is new and bleeding edge just because it would be cool rather than use older technology which was more suited to the job. I program in VB, BASIC, FORTAN, C/C++/C#/Java/X++, PL/SQL, TSQL and its brilliant to be able to say I have a problem that a particular language will solve neatly, rather than coercing another language into doing something that it wasn't meant to do. Lets face most programmers worth their salt can emulate features found in other programming languages, but why reinvent the wheel.

by problemsolversolutionseeker

Have you ever noticed that articles about good programmers take an unnannounced left turn into conversations about preferred languages?

A more proper article should be 'What makes a good solution provider for any given set of tools?'.

by rclark2

My education was through the Air Force tech schools, though I have picked up college courses along the way when I needed a particular set of skills. I have been a programmer over 25 years, and agree with you totally. I didn't jump on the band wagon when VB6 came out, so I am falling behind on all this OOP stuff. I realize I have to learn it, but right now, most of the problems I'm coming up against could have been solved with a 286 and qbasic if that platform had been web enabled.

Your point on mathematics is well taken. I have trained dozens of programmers over the years, and most of them have succeeded or failed primarily based on logical thinking skills. I can give them the toolkits to program, and most can function, but to really become a programmer, a systems analyst, or a development architect, you have to have that thought process.

The Air Force uses a cookie cutter approach to making programmers. They get a lot of cookie bakers, and not many chefs. Their basic formula is teach programming primitives in a pseudo code language. Then throw half a dozen languages at the students, showing how each primitive is used in each of those languages. The languages didn't matter, the idea was to show that each language had methods to implement each of the primitives, and that each primitive solved some type of processing problem.

There has been a lot of books, code, and articles written on the philosophy of programming. Most of it would make good fire starting material. At it's core, what we do is solve problems using tools. Without the problem solving ability, no tool is useful. With problem solving ability, even without tools, you can solve the problem. Absence of the right tools just means a little larger problem, longer project, or more complicated solution. I hear the "Don't reinvent the Wheel" over and over again. The problem is, we don't have any "Wheels" out there to program with. When is the last time a wheel was completely redesigned from the ground up because it didn't fit the latest philosophy? Wheels are wheels because they work. Languages are dynamic and should be. But we shouldn't have to reinvent the whole language every three years to solve the same problems we have been working with for the last 20. When paradigms change, so do the tools used to interact with them. The PC was one, the web is another. What will the next be? Who knows. Maybe wands. Maybe implantable processors. Maybe something so strange that we wouldn't recognize it today.

 

by matthew_web

It should be noted that .Net has a lot less previous versions out there in comparison to Java, so looking at levels of backward compatibility is a bit skewed...

by pan

Eclipse and NetBeans do produce compatible code. They both produce code than can be deployed in any Java app server, or packaged as jars that can be executed from a compliant JVM. If you use Ant for your builds it's even easy to create a project in one IDE and then port it directly to the other.

Do you have any examples where NetBeans and Eclipse produce code that isn't compliant?

by vytautasb9

Your arguments are logical.  One thing I noticed in the Open Source community is that there seems to be no certification or accreditation of the software.   I think industry/military organisations would seriously consider using OS software if there was some gaurantee that the OSS provides both the desired functionality and security.  Perhaps the OS community could sponsor such a certification authority and based upon an accepted security criteria issue certificates?.  A great killer app would be open source software together with a certificate of compliance.   The goal of getting software certified could also be shared by the developers of proprietary software as well. Perhaps proprietary software would improve as well from the competition? May the better software win.

by tlfu

Insert comment text here

I suspect that Justin is referring to code generated by the UI designers of each of the IDEs. If you use the NetBeans UI designer to develop a Swing-based UI, you cannot then switch to Eclipse and use its UI designer on the same code. This often causes Java developers to shy away from using the IDE's UI designer tools at all.

by korkiley

I haven't used it, but I see that there is a NetBeans Eclipse Project Importer now included in NetBeans.  You are also supposed to be able to create a .war file in NetBeans and then use the 

"File > Import > WAR File" menu/wizard in
Eclipse WTP" to import a NetBeans web project.  I haven't used any of this stuff, nor am I a java developer.  I've used eclipse in the past for learning purposes and found it a bit confusing.  A quick look at NetBeans gave me the impression that it was better organized and more inutitive but that's a very hasty judgement.  And yes, applications written in java seem to be extremely slow if StarOffice/OpenOffice is representative.  Compared to pascal and C, languages that I've used in the past, I've found it pretty tough to get off the ground with java!

Kor

by eldergabriel

Although some will debate the validity of the criticism this author
makes, i applaud him for making these points nonetheless. The
developers who are doing the engineering to create the .Net and Java
platforms/frameworks need to have their collective "noses held to the
grindstone". And that goes for IDE developers, too. ALL developers need
to be held accountable and pressured by the market to make their
respective platforms/frameworks/tools as simplistic-to-use, yet
powerful, and consistently open and portable as possible. (Fortunately,
in the case of eclipse, if there's something an end-user programmer
doesn't like about it, he or she is allowed to change it, due to the
freedom its license provides. Given this fact, if eclipse provides a
superior way of doing things, and netbeans refuses to change, then it
is up to netbeans to "evolve or die".)

End-users and programmers have every right to demand that all their
tools and target platforms play well together. It's constructive
criticism like this that keeps developers on the right track. Not only
do the end users benefit, but i think that ultimately it makes
everyone's lives better when all these needs mentioned above are met.

Incidentally 1) i was also thrown for a small loop by the large and
slightly unclear selection of packages the first time i went to
download the windows version of eclipse (Fedora, for one, at least
whittles it down to a few core packages and eliminates some of the
confusion). 2) i also find the .Net framework and toolset slightly less
overwhelming and confusing than what exists in the java world.

by fmcgowan

People have been predicting the imminent demise of Java for at least 10 years. It's still here. It probably will be here in 10 more years. It is better than it was 10 years ago and will most likely be better in 10 years than it is now.

Yes, certain classes and methods are deprecated from version to version but you generally get a warning message when you try to use one in a new project rather than an error for several point releases before the thngs are actually dropped. An exception was the change in the event model and the resulting change in event handlers when Java went from version 1.0.x to 1.1.x many years ago. The ability to compile a new program in compliance with an old JRE
spec and the ability to install several different JRE versions on the
same box at the same time pretty much make this argument a non-starter, anyway.

The "there must be ONE IDE or people will be confused and go back to VB" argument is a variation on the similar argument reagrding how the KDE/Gnome UI "confusion" is keeping users on Windows. Maybe, but so what? The same applies here. Most of the people professing confusion about NetBeans vs Eclipse sound like VB programmers, anyway. OK; use the tool that can do the job and that fits your hand. If your choice is different than mine that's OK; use .NET if you want, I'll use Java. Use NetBeans if you like; I can still choose Eclipse. Not a problem.

I also get a kick out of the argument that basically says that if the alternative to the MS product in any category is not *absolutely* perfect for *everyone* than it's *useless* for *anybody*. Funny, nobody even tries to make the same argument against using MS products. I guess they *are* perfect for everyone... Right?

by mark miller

I see some commenters are confusing the issue. The point that J. James is making is that it's the people that make a difference on a project, NOT the process by which the software is made. For several years I've heard claims made both online and offline that OSS is inherently more stable and secure, because of the open source process of making software: the "many eyes" theory. There is some truth to this notion, but it is not universal. From what I've read from a few sources, developers who work on open source projects tend to focus on what's exciting about it. There are aspects of projects that are boring, whether it be auditing the code, or focusing on a feature of some piece of software that is necessary for its functioning, but just doesn't scratch that itch that programmers have. These areas can tend to get neglected. In other words, there are "many eyes" on some aspects of the project, but very few on others. This equation can change if the primary people working on the project are paid developers, even if the project is open source. Paid developers have more incentive to listen to direction from a competent product manager, who will insist that the boring aspects of their projects get their attention.

by wayne m.

"Many Eyes" Is Not Better

Though this is really a side bar to the major thought in the blog item, I would like to point out that multiple reviewers is actually a detriment to quality.  

It was pointed out by Dr. W. E. Deming, among others, that multiple reviewers leads to a decrease of attentiveness by individual reviewers plus a "group think" issue, where individuals become hesitant to point out issues that no one else has raised.  Having a thousand reviewers becomes no more effective than zero reviewers.

This is by no means intended to be a swipe at open source, merely a recognition that any development approach requires an explicit mechanism to identify short-comings.  Relying on lots of reviewers simply will not get the job done.

 

by jmgarvin

Most posts here couldn't be more wrong. I don't know why this
myth keeps hanging around. Look at the security and tight code of
Apache. Look at some of the FLOSS projects that, out of the box,
are more efficient, secure, and effective than their counterparts.

I suggest everyone take a read of:
The Cathedral and the Bazaar
Nip Nikolai Bezroukov's card in the bud
Open Minds, Open Source
The Magic Cauldron

Better Quality Control
No more Secrets
A good paper on the benefits and drawbacks

by hopefulcoder

Unfortunately opensource today is just MS windows vs Linux and MS office vs Openoffice and MS IE vs Firefox. They just dont think beyond that (the open source guys). Even if they do want to opensource everything who is going to fund them :)) TO all OS guys, how about cloning websphere, rational rose, java etc ?? 

by jmgarvin

Who's going to fund FLOSS?  The consumers.  Those who buy the products.

Just because it is free doesn't mean it is free beer...

by apotheon

I'll respond to points in an order opposite that in which they've occurred.

  1. Funding: Funding buys manpower in software design. Since open source software provides free manpower, funding isn't really necessary. On the other hand, jmgarvin is right ? it's entirely possible to sell open source software (and support and so on), and you can then use some of that funding to pay programmers who will improve the software.

  2. Cloning Software: There are open source "clones" of the Sun JVM. I don't know much about Rational Rose, so I'm afraid I wouldn't know whether there's a "clone" of that, but I do know that it runs on Eclipse ? which is open source. There are open source systems that provide functionality equivalent to WebSphere's, though there are significant differences (since they're competing technologies and not merely an attempt to copy it feature-for-feature).

  3. jmgarvin's List of Links: You forgot one. Have a look at Security through visibility: The secrets of open source security. What's that? Why, yes, I am sort of an attention whore at times.

  4. Supposed Refutations of the "Many Eyes" Principle: You're assuming "many eyes" in an open source development methodology are subject to the same limiting circumstances as "many eyes" in a closed source development methodology. The truth of the matter is that in a popular open source project, there are typically at least dozens of people who regularly skim bug reports and fix a bug now and then ? and those bug reports are generated when someone has trouble using the software for some reason. As a result, flaws and vulnerabilities in software get fixed without having to institute a formal review process as you would with closed source software. There's no "groupthink" issue, no "unglamorous work" issue, and so on. When someone defines a bug for you, it's generally pretty easy to fix it. In addition to this, people can fix their own bugs, so when a bug is noticed by someone who not only uses the software but also knows enough to be able to fix it, that person can submit a patch so that later updates to the software will include the bugfix. This adds the programmers in the software's userbase to that "many eyes", without suffering any of the problems that many paid eyes would create in a closed source project.

by apotheon

I see nothing in particular with which to take exception in your post, J.Ja. In particular, though, I'll comment on the calculus issue:

Calculus itself doesn't really teach any skills that are needed. In fact, higher algebraic maths would be even more helpful than calculus. What's helpful about learning calculus is the mathematical logic it teaches, and what's helpful about the mathematical logic is the fact that it's logic. As such, something like Linear Algebra would be more helpful than Calculus II. On the other hand, a course in Symbolic Logic would be about as useful as an equivalent-level algebra course -- beyond basic algebra and logic, mathematics is not very useful to programming skill at all.

Calculus ensures a fairly solid grasp of logic and algebra, which is a good thing for programming, to be sure. There are other ways to get the same skills, though, without having to estimate the volume of an irregularly shaped container.

by rev.hawk743

Point One:
The issue is fewer bugs.
Point Two:
Then when there are bugs shortest fix time.
Point Three:
Not repeted bugs.

Now! which fits    Open / Closed
In my house hold, My wife is a great person, but getting yahoo! web
page to look as her way it should under winders 98, 98se, ME, Xp Home,
Xp Pro, just did not work.
But A load of Red Hat Fedora Core 2 and then Three / 60th of an hour. It was done,
Get-hur-Done Once is best, don't you think ?  She is sold on
"OPEN" and she lives with no ".pps, .wmv," and some ecards that done
work under Mozilla.    That is fact!
And fact is all that is real...  ..........ed   
All other things said, that is what we paid, real working  OS, not
junk out of Wash~ Stat. whom will charge you $495.00 to strip you
software form you machine that you wrote / and reconstructed from poof
up disk that 95 did to it. All the while charging to help you ~~~
not.  Then later seeing some code in WindersAPI  for three
button mouse that didnot even change the incorrect spellings of each
button statements of that code  ie:
leftwinmousebuttun, middlewinmousebuttun, rightwinmousebuttun, and some
more incorects this a type "O" but work in the source code any
way.   who neads to fit miss spellings when you just trying
to get that really nice track ball working again in your own
machine.  mnow I donot spell well at all mnumonic did not
either.   I didnot write all the code I just fix what wash
out stat did to it while i had exames to get to or studies for.  I
know bad grammer is here also.  Bbut!  Time was short. and
those classes just keeped coming around.    So they did
not even correct the grammer either in the remarks
statements.    Now that is "Close" statements uses of
code after complied and leaving the symbolic parts in the C:\mouse\*.*
directory.     Some coded because it is not cheep
to open them as proof.   That is why wash~stat can't open
source anything, because very little is without problems at
wash~~stat.  
I've used many different OSes: everyone of MS; PCDOS; OS/2; Portals;
and
UNIX also Linuxes.   I loved OS/2 warp {3.0}{4.0} witch
started out as joint project {MS / IBM} but was later only IBM while
still giving MS copyright markings to programs.  
the OPEN sources do have few weak spots in all POSITCs is most compactable.
Compatable is what sold MS - OSes, but saywhat about office97 does not
work with office95 or office98 and under XpHome write's ".rtf " don't
with the other Xp Pro write ".rtf " either. So that parent brings home
an HP w/windows XpHome for kids to do home work, on. The kids then uses
the write program for that home work and takes to school, where 
that school uses Xp Pro and wordpad  {write by another name}
just  will not show that kids work to the teacher.   And
to top it off  that  Xp Pro does not reconize  the
floppy  which was formated  by the kids  XpHome
computer.    And MS has still to answere that one
yet.   That is not bugs those are software that will not be
compatable by choice of MS design. I did the test ing my self with
other OEM loaded machines, yes they don't read each other floppies.
and write does not read write outs even when sent by email to the other machine.
My test was done useing "AOL cisnet Xphome edition" to egghead Xp Pro".
The Kid's  was HP XpHome to Compaq Xp Pro.   the problem
is that if the person formats the floppy before use then the none
reconization is triped on. The floppy drv
technics & panosonis under other OS no such differences showed up
same machines were used and no hardware changed.   Why should
we deffend this kind of programming?   P.S. all spellings
& grammers or no perposses. The Trade Marks are of the respectfull
owners.   And all test are not concluesive.  But there
reason to be  of  aware....  Teachers  are not
computer testers, why should they be.    P.S.S. 
Please strip and edit for safer uses.

by jaqui

Open source, in and of itself does not produce
better code. Better coders and better testing produce better code. It
is that simple. When a closed source shop has the better coders and
better testing, they write the better software. When an open source
project has better coders and better testing, they write better
software. To think that just because a piece of code can be modified or
inspected by anyone and everyone means that the best coders and testers
will be modifying and testing that code is just not correct.

The reason that Open Source has attracted the better coders is simple, the pool is every coder in the world that they draw from. The proprietary software houses have only the pool they hire, and the best coders are not all working for the same employer.

Yet all the best coders in the world can contribute to any open source project they want to.

Why is most popular open source software so blessed with good coders? Because they choose to contribute to a piece of software they they see is usefull. All open source software is rated on that one point, if it's usefull, it will be used and draw a community of people to support it. If the original creator of it dies, the software can continue to be improved. If  no-one finds the software usefull, it will die off a quick and painless death. Proprietary software is rated by how much money the company makes off it. If they don't make enough, it doesn't matter how usefull, or what quality it is, it's gone.

by jaqui

I actually agree with the real meaning of JJa.'s post. Until one jvm will run every java application ever written java is broken and needs serious fixing.

get rid of the jvm options until there is one only.

Perl, Python, PHP, Ruby all have one interpreter each, that runs all applications written. There is no excuse for the conflicts in jvms other than poor quality control.

by justin james

This is the third of a three part series regarding how to think like a programmer.

One of the biggest mistakes that I continually see in the world of technology is the problem of short term expediency versus long term solutions. All too often, a programmer takes shortcuts based on what is easiest, what tools are in his toolbox, or what technologies are currently popular. These kinds of compromises lead to systems that are kludged together becoming legacy code that is nearly impossible to maintain, inefficient, and slow.

Recently on TechRepublic, there was a great discussion on whether or not a developer should try to anticipate their users' needs. Part of that discussion came around to the idea of just how generic the code should be, which really balances the trade off between initial development time and long term flexibility. For example, in an OOP language, the programmer can implement every piece of code as a class, ignoring the chance that in the future their might be a need for that class to have been an interface. On the other hand, to write everything as an interface and only have one class implement it adds and extraordinary amount of time to the development process. It is indeed a fine line.

One example of where this tradeoff never should be made is in the readability of the code. I do not care what kind of deadline you are under, there is simply no excuse for naming variables "a," "b," and "c," the extra bytes will not break your budget. In fact, for every half second saved with writing the code, you are probably adding three minutes to the debugging time.

Another shortcut that causes big problems down the road is the inefficient usage of libraries. It is all too tempting to load up a million libraries for just one, easily replicated function. The end result is an application that does not scale well. Take that little Web application you wrote, the one with a million dependencies, and look at its memory usage. "But it is only using a few hundred kilobytes!" you say. Multiply that by what happens if your application suddenly gets very popular, or used in a large corporate environment. Multiply "only using a few hundred kilobytes" by 70,000 simultaneous users, and all of a sudden your systems administrator is banging on your door and using words like "refactor the code." If you are loading a whole library for just one small call or two, ask yourself if that is something you really need, or could possibly re-write within your existing code. That is one nice thing about open source, you can take what you need and leave the rest behind.

XML (and similar technologies) are another pitfall. I know that I keep harping and nagging about XML, but it bear repeating since it seems like everyone likes it so much. XML is easy to use, there are plenty of libraries and built in functions in most major languages now to handle it. But it is ridiculously inefficient, both as a transport mechanism, and in terms of systems resource usage. XML manages to get the worst of all worlds; it involves a zillion more bytes worth of delimiters than a standard flat file, and uses a tree structure that is CPU intensive (to say the least!) to parse. If you find yourself reaching for the XML scheme for tabular data, think again. Take the twenty minutes to write and test a CSV creator on the data end and a CSV parser on the client end. Not only will you save yourself the overhead of those XML functions, but the size of the data will be significantly smaller, and the parsing will be faster by an exponential amount. Even better yet, if you have the same language on each end, serialize your data structures and pass them around. It may be bigger than a flat file, but it will be even lighter on the CPU. Microsoft learned this lesson in the Live applications; they switched from XML to JSON and the speed went up dramatically.

It has been my experience that debugging and testing often take up at least 25% of the programming process, and frequently extend to 50%. Code is relatively trivial to write if you start with a solid knowledge of the language, the business goals, and some quality pseudo code (which you should be writing anyways to verify that the program meets the customers' needs). Spending a few extra moments to reduce unnecessary lines of code, ensuring consistent variable naming, giving variables proper names, skipping implicit operators unless they are obviously being used, and so on goes a very long way towards making the debugging and code review process go as smoothly as possible. What is the use of saving twenty minutes coding if you increase your debugging and maintenance by 10%?

Also learn about how your interpreter or compiler handles conditional statements and loops. It is all too easy to write one of these statements in a way that causes your application to run much slower than needed out of laziness or ignorance. For example, if the language you are using evaluates conditionals from right to left, put the conditions that are most likely to make or break the condition on the right. Why evaluate conditions that are not likely to make a difference? The same holds true for loops. Sure, it is easier to write something like: for (intRowCounter = 0; intRowCounter < tableDataSet.Rows.Count - 1; intRowCounter++) { but your users will be much, much happier if instead you assign tableDataSet.Rows.Count - 1 to a variable and check that variable. This eliminates the software from having to keep going down the object tree to find the count of the row object, and then subtracting from it. Little things like this add up very quickly, especially in a commonly run block of code.

Programming with this type of thinking requires a wholesale shift away from the short term, towards long term thinking. I have listed only a few tips here, but I think you get the idea. Ignoring the long term consequences of your coding for short term expediency is the path to buggy and slow code that you will regret ever having written, and your users will wish you never wrote it.

J.Ja

This is the third of a three part series regarding how to think like a programmer. Part one discussed the reason why mathematics skills are important to the code writing process. Part two discussed some techniques for expanding your thinking skills to be a better programmer.

by jaqui

XML= eXtensible Markup Language

It is designed for use in laying out the look of a document to meed the needs of your application.

using XSLT to alter the data in the document is leveraging XML to do something it was not designed for. I will use XML for layout purposes, as it was intended, but for manipulation of the data, better to use a different tool. Like using PERL to manipulate textual data, then XML to present the data. This uses both tools for designed purpose.


AJAX is another tool that is being pushed right now, that really needs to be rethought by those pushing it.
when broadband / low cost data transfer internet connections are really only widely available to 25% of the world, anything that sucks data transfer capacity just to maintain state needs to be shelved until the rest of the world has the cheap data transfer and broadband connection availability.

by ozpenguin

> All too often, a programmer takes shortcuts based on ...
what their manager/client constrains them to.

Don't blame programmers on the fact that there is neither the time nor budget to do the job properly. It is not the programmers who are looking for shortcuts, it is the guy who has to put his hand in his pocket to pay for the work. This is always a short term solution, but people must work within the constraints the are given.

by pdq_rose

I found myself smiling and agreeing with most everything you said in your article.  I think your series has alot of good points and it's certainly good to have a large repertoire of languages and techniques on your plate to choose from.   I've found the key to being successful is being well balanced and knowing what to use and when.   For example, I've met alot of people who feel programming a database (ex: PL/SQL, Transact-SQL) is the only thing that really matters...everything else a waste of time.  So, I've been on projects where database was just given way too much importance.   In some enterprise systems, your database can be extremely important, but it is not always the only thing that matters.  Then you have those who want to rewrite the OS kernel in order to solve a simple business problem.  There has to be a good balance between what is needed and the best way to solve the problem.

 

by stevenschulman

I do not understand the complaint that code may not resize well and that if all of a sudden the code will be used "by 70,000 simultaneous users" then refactoring will be necessary. If there is low demand then there is not problem with the quick-and-dirty version. If the program uncovered a previously unidentified demand then the programs probaby should AT LEAST be refactored. It probably should be rethought out completely.

by mindilator9

another aspect i think is missed is the awareness of other solutions to use. sure we're either all rocket scientists who can code or we're just subclass instances of the CollegeEducation object, but some people (myself to a degree) end up teaching themselves a language, or new things about their favorite language. and we all know we have to stay vigilant and keep up with the current technologies. does this mean we go back to college and get the complete digest on the new fads....every 4 weeks? most of us even with college educations or IQs that can't be determined by an algorithm end up teaching ourselves the latest thing. this means almost all of us lack the proper guidance in a particular language. some programming shortcuts are only shortcuts in typing speed, while they end up using unnecessary amounts of memory or bandwidth. we as eager students find these typing shortcuts and revel in their efficiency, never knowing the underlying effects on the bits themselves. no one will deny that ajax is poorly documented, and that's why all too often it is poorly implemented. my boss isn't going to pay me for the time to learn to use a new technology correctly. half the time it is replaced or obscured by some new rising star just as soon as you figure it out. i wholeheartedly disagree with my boss' inability to perceive the value; but he isn't a programmer, he went to business school. to him it doesn't make sense. to me it's the only thing that makes sense. i absolutely believe that everything in this universe relates to everything else whether you can perceive it or not. being a good programmer, education aside, relies just as heavily upon having a good boss who understands the value of spending time now to achieve long term success. unfortunately the business world is scared poopless that it will collapse tomorrow so every focus is on the current quarter profits. doing things the right way makes no money today. sad but true, i wish it were different.
but i do take your article to heart. i was under the gun to write a program that takes a 500 field application and map the data to some specialized commercial software, to shift the burden of data entry to the user. i was just out of school and so i wrote roughly 12,000 lines of code and, in between my other duties as tech support, the project took me about 9 months. after that i was able to take more time to learn the subtle do's and don'ts and i recently went back to the app and pared it down to about 4000 lines of code. it also took me much less time to do so than to write the app the first time. this means if my boss had taken my initial advice and time estimate to plan more before development, i could conceivably have done it in 3 months. yet there was no way i could quantify that to him, he was uninitiated in the world of programming. he sees the lesson now, but it was a hard one to learn. bosses want to know the exact x amount of dollars, or close enough to it, that your precious time spent planning and debugging is going to save them. when those dollars are saved by lack of complaint calls to the support line, or by lack of being in a problem situation altogether, it is nearly impossible to impress that value on the man with the red pen. they are hypotheticals, and only programmers deal with that, it seems to me anyway.

by wayne m.

Refactoring

I suggest we take care to use the term "Refactoring" as was used by Martin Fowler in "Refactoring - Improving the Design of Existing Code."  Refactoring is changing the readability and maintainability of code, it does not include adding functionality nor improving performance.

It has been widely accepted that software performance enhancements should be treated as a separate practice and be done after implementing functionality has been completed (one should avoid premature optimization).  Refactoring is taking an identical approach to code clean-up.  Code clean-up needs to be recognized as a necessary step in producing code and not something that is done unofficially and informally.  Focus first on implementing the correct functionality; use a refactoring pass to correct variable and function names and decomposition.  Next, if ncessary, have a pass at performance enhancement (library usage would certainly fall into this category), but make sure this is done based on measured characteristics.  Follow the performance enhancement pass with yet another refactoring pass.

It is a matter of focus.  Approach an effort as a four stage task - Functionality, Clarity, Performance, Clarity Again.  Do not try to do multiple things at once.  Expect to do a refactoring pass to improve the readability and design of the code, and then make sure to do it.

 

 

by xitx

Achieving long time goals doesn't conflict with the short term ones. To an experienced programmer, not matter it's a long term solution or short term one, the design or the code structure is always the same: easy to extend and maintain. For a programme with less experience, spending tons of time doesn't always result in a good design.

Design is the King. Coding is trivial. Any codes should be in modules and easy to be taken out or put in. Like buiding a house, the structure is the frame and the particular functionalities are the bricks. Bricks can be taken out or added easily without affecting other parts. All are dependant on the good structure.

 

Dennis

by deveshpradhan

Excellent Article....agree with you on all points...I think most of the programmers do not relate them self with the user needs....if they can think of the other side(user's view) then probably they can think and imlement it better. Hence coding is not only about mastering languages but mpore in applying it to the user needs.....

Thanks a lot again for such a great article...Most of people know these points but they tend to forget/ignore it once they are into the coding phase.

.

by mark miller

Justin James said:

Sure, it is easier to write something like: for (intRowCounter = 0; intRowCounter < tableDataSet.Rows.Count - 1; intRowCounter++) { but your users will be much, much happier if instead you assign tableDataSet.Rows.Count - 1 to a variable and check that variable. This eliminates the software from having to keep going down the object tree to find the count of the row object, and then subtracting from it.

It depends on what language you are using. If you are using C# it's my understanding that the compiler optimizes the loop test so that the expression "tableDataSet.Rows.Count - 1" is only evaluated once during the loop's execution. Not all programmers like this, since they'd sometimes like the for construct to re-evaluate the test condition, since the value on the right side of the comparison operator (for the sake of argument), using a different expression, may change during the course of the loop. This behavior is not without precedent. Many years ago I worked with a dialect of BASIC that implemented this same sort of loop optimization.

by grantwparks

I don't understand your detour into XML bashing.  It's antithematic to the rest of the article; XML's malleable and self-describing nature are what make it a superior representation format for the structures required to enable data-driven applications.  And data-driven, rule-driven meta programs don't require constant attention and rewriting as needs change.  Of course other, simpler formats are more appropriate for large datasets of predictable "rows" of data, but your CSV alternative is comparing apples to oranges when you complain about XML's "resource usage".  I would counter that if one were to load his entire CSV file into memory and then try to randomly navigate around it, using values in one row to access other rows (as I can do with ease in DOM using XPath) would result in a much more innefficient application.  Granted, you do make the distinction about not using it for tabular data deep down in the paragraph.  My gripe is that you should've made the point be "use data representations that are appropriate for the volume and type of access".  I can think of many examples where people have wrongly employed database tables to contain metadata and rules to control an application - requiring lots of brittle code (and painstaking restructuring) whenever the underlying schema changed.  

Of course it doesn't help that MS seems to not have a clue what XML is all about, or at least they are not passing it on to their large base of devotees.  It is not simply a data representation.  Have a peek at SVG and RDF.  To duplicate what these technologies provide using traditional data mechanisms would be barely possible for most programmers.  See how easy it is to query a database for *tabular data*, returning the results in XML and transforming that with a simple XSLT into an interactive chart.  Sans coding.  The unfortunate reality is that few in our field today have enough breadth of experience to be able to call on enough tools.  When one's pallette only has a couple colors, the results can be pretty bland.

(Jacqui - pretty God-like of you to know what things were "intended for"; computers were intended to solve artillery trajectory calculations and calculate compound interest.  What are we doing on the Web? ;-)

by kirk12

I fail to see how competion in the IDE space could be responsible for the failure of an entire platform. In fact isn't it completion that has forced the other camp to finally fix some of their creeky stuff???? Long live competition!

by kirk w.

I find it interesting that you promote Calculus as important to be a great programmer, yet you say that the excellent programmers had degrees in Physics.  Calculus is necessary for a Physics degree, and my experience has been that it is the scientific way of thinking, that makes for excellent programmers, not the mathematical way of thinking.  Mathematics does not teach the deep analytical thinking that science does.  It is the development of a hypothesis, performing an experiment, and analyzing the results that are the basis of great programmers (e.g. analyze requirements, design code, test driven development). 

by staticonthewire

It appears that you are trying to quantify what defines a good
programmer (How to "think" like a programmer is the same as how to "be" a good programmer, yes?). This is a hopeless activity - charming in a way, and
bemusing; it will fill many hours of time if you let it.

But it isn't truly productive in the long run, because programming itself remains undefined.

Programming remains undefined for good reason: It isn't a single
activity, it isn't a monolithic discipline. The characterization of a
good database programmer is wildly different from that of a good web
programmer or game programmer or widget programmer, or AI programmer,
and if you reduce your list of characteristics to what is common to all
sorts of programming you end up with a plain vanilla list of things
that are good in ANY discipline... "good programmers are...
CAREFUL...". Yeehah.

Programming is achieved with language; any language worth the name is
an open system, open systems cannot be meticulously defined, they can
only be mastered - ask Hilbert and Russell, who spent half their
professional lives trying to formalize mathematics before Godel upset
the applecart.

Scientific background is certainly helpful to a programmer; it is also
helpful to an accountant, and even to a priest, and probably to a broom
jockey too. Creativity is also helpful in navigating most disciplines,
but saying things like this isn't really saying anything useful.

I think you're pursuing an interesting line of thought, but I think you've
framed it too narrowly, creating a figure/ground confusion for yourself
- mistaking the dollar for what it buys. You correctly identify the
point of phase change, when a discipline shifts from
philosophy/folklore/religion to science - it's when quantification and
repeatability creeps in. But programming per se can never BE a science,
any more than English can be a science, or Urdu, or Tagalog. The STUDY
of English can be a science, and the STUDY of programming can be a
science, but a language itself, whether C++ or French, is not science.
There's a difference between biology (a science) and elephants (one of
the objects biologists study).

Certain efficiencies can be achieved by programmers if they acquire
analytical skills and problem solving skills, and these skills are also
common to many scientific disciplines, but they are not a priori
scientific methods, they can be applied to landscape painting or
cooking or burping babies too. I have frequently found myself using the
scientific method of theory/test/repeat while debugging, or when
building a special use compiler, but I also use it in analyzing the path I take from my front door to the train station. Programming is more like music
than anything else, I think - part math, part inspiration, part luck,
part muse.

The example you gave of reducing tabular XML data to string data and
parsing it so - this is not a balanced example. In a large organization
dependent on a phalanx of programmers doing things transparently, the
efficiencies of your one-off string parser are rapidly lost in the
welter of confusion that such cowboy antics can create in a big shop.

Big shoe
factories don't employ cobblers, no matter how artistic/elegant/efficient their work may
be. But certainly there is room in the world for custom shoes crafted
in unique ways, and there will always be a boutique market for custom
code of the sort you describe. XML is just a way to get data from point
A to Point B, better than some ways, worse than others, and most
importantly better sometimes and worse sometimes. And once again we run
into the impossibility of thoroughly quantifying the needs of "this
discipline we call code". Sometimes ya need one thing, sometimes
another.

Your contention that Skinner quantified Psychology is just wrong
- the bastard learned how to brainwash pigeons, for heaven's sake,
something every major religion achieves in its infancy, and a human
legacy thousands of years old. He sure used big words to describe it
though, didn't he? Much of his work has been discredited or
dramatically reduced in scope, along with many of his data collection
methods. Most importantly, he failed to account for feedback - the
effect an organism can have on itself. He refused to consider internal
stimuli at all.

He made one truly interesting discovery: His Paradoxical and
Ultra-Paradoxical Phases, when a stimulus would no longer be required
in order to evoke a conditioned response, or would evoke
counter-intuitive responses. Don't sound like science to me. I'm afraid
psychology (define "psychology") remains at best a mendicant's art, and
it's practitioners are mostly self-deluded charlatans and pill pushers.

I think you're several decades ahead of your time, J.Ja. - might be
better to define the field of endeavor - programming - before you start
in on the qualifications necessary for its practitioners.

This doesn't mean the discussion is useless - there are many
interesting things about mathematics and much has been achieved with
it, despite it being unquantifiable and inherently intractable when
subjected to analysis. Little arenas of clarity can be staked out in
the chaotic jungle or our discipline, and they should be. But don't
imagine that the rules that apply in one arena necessarily apply to the
clearing just down the road...

by mark miller

staticonthewire said:

The STUDY of English can be a science, and the STUDY of programming can be a science, but a language itself, whether C++ or French, is not science.

Maybe I misunderstand you, but C++ or any programming language is based on scientific and mathematical principles. In contrast French or any human language (perhaps with the exception of Esperanto) is not. Programming languages are based on a structure called a context-free grammar. French and other human languages have context grammars. It's been a while, so I don't remember exactly what "context-free" means when talking about programming languages, but I know it has to do with disambiguating the language so that a compiler or interpreter can parse the code and produce logically consistent results. This may be a bad analogy, but the one that came to mind is it gets rid of the "Who's on first" (referring to the Abbot and Costello routine) types of confusion. Programming languages have been fashioned in such a way that programs written in them always reduce down to a string of symbols (if the program conforms to the grammar correctly), which then may be translated to machine code, that can be executed in a logical fashion by a computer exactly as specified by the source language. So there is a science to creating programming languages.

How a programming language is used is not restricted to scientific methods, though they can be applied to it.

by staticonthewire

Two excellent points, Mark, but my interest (and my post) were based on
the second of your two points. It's true that all useful programming
languages are based on a defined context-free grammar, but this doesn't
mean that all productions of that grammar can be formalized
(which is your second point, and the one I emphasized in my post). I'm
not so interested in how a language is created - mathematics is also
based on a formal context free grammar, and while it's fun to play
around with Backus-Naur formats and come up with little languages of
all sorts, the real interest for me is in what a language can produce. As you point out, even formally defined linguistic systems have an infinite, open ended production list.

And that's why I was bemoaning J.Ja's campaign to quantify the characteristics/qualities of a good programmer.

The one thing all computer languages have in common - even the
"symbolic" languages and the cut-n-paste/drag-n-drop tools - is that
they are all languages. And languages, as we have both now
pointed out, are unconstrained production systems. This, it seems to
me, indicates that the skills a programmer of ANY language would need
would depend on what production subset they were specializing in. This
is what I meant when I said that different kinds of programming require
different skill sets.

This sort of defeats J.Ja's whole campaign, since, if a language is
capable of infinitely many productions, it follows that there are
infinitely many production subsets, thus, infinitely many skill-sets,
thus an enormous difficulty in defining a non-contextual and still
useful set of programmer skills or programmer qualifications.

J.Ja's overall goal (the formalization of characteristics for a good
programmer), like David Hilbert's and Bertie Russell's, seems
impossible to me. But as I also noted, things of value can still come
from the attempt.

Maybe I'm taking this 'way past the point J.Ja intended, but I don't
think so, because he specifically refers to the phase change between
scientific and non-scientific endeavors, and I assume he did that for a
reason - i.e., he wishes to place the defining (and eventually,
perhaps, things like hiring) of programmers on a scientific
footing. I was simply pointing out that this seems premature - perhaps
by decades... and in the long run, a bit Quixotic, yes? Since it really
boils down to an attempt to number an infinite system.

BUT - I applaude his industry, and suspect we will all learn once again what we already know - you cannot formalize a list of characteristics or skills that fully encompass what it means to be a top-flight programmer. Not in this day and age.

And you should thank your lucky stars that it is so...

by mark miller

I agree Justin is defining a "good programmer" too narrowly. He's thinking of programmers as those who work on OS kernels and compilers, or device drivers. Most programmers out there don't work on this sort of thing, and wouldn't get the opportunity if they tried (unless they wanted to write these things themselves or join the Linux kernel team or the team developing a programming language).

I take exception to the notion that physicists make great programmers. I worked with a programmer whose only degree was in Physics. He wrote code that worked, but it was difficult for anyone else to understand. The setting was a company that wrote custom business accounting solutions for a vertical market. He was notorious for writing the following in C (I put in comments to say something happens without actually doing it):

int Read(char *a, int b)
{
   int i = 0;
   int c = 5;
   for ( ; i < b + c; i++)
   { /* do something with a */ }
}

or,

{
   while (1)
   {
      if (cond1)
      { /* do some stuff */ break;}

      if (cond2)
      (/* do some stuff */ break;}
   }
   break;
}

He just used the while structure so he could use break statements to skip past the bottom of the loop structure once a step was taken.

Besides the function name, the rest of his code was cryptic. He never learned structured programming, and he got complaints about his one-letter variable names, which were only understandable to him. This made working as a team with him difficult. He was a nice guy, and easy to work with on a personal basis. But by our criteria he was not a great programmer.

Another programmer I heard about a long time ago, working at a small software manufacturer, was a genius. He could write working, highly functional programs in a matter of a few days that would've taken any of the rest of us a few weeks at least. I doubt it had to do with his programming technique, or that he was a faster typist than us. He just had the ability, IMO, to work the whole problem out in his head and then just "stream" the solution into working code. The problem was nobody else could read what he wrote. He programmed in C, but he would use labels and goto's to implement loops, when a for or while loop would've done the job just as well. It was as if he had learned how to program in either BASIC (old-style with line numbers) or assembly language, and just applied the techniques learned in those languages to whatever language he was programming in. It made his code utterly unmaintainable. We were getting complaints about memory leaks in the software, but we had no easy way, by looking at his code, of finding where the problem might be. The only senior engineer there, while I was there, spent a significant amount of his time rewriting this programmer's code, as structured code, so it would be readable.

by staticonthewire

I also had trouble with J.Ja's criteria and definitions, for similar
reasons. I think science in general, math in specific, and the
scientific method (in the design and debugging context) are particularly
pertinent to programming, but as I mentioned, music also seems to be a
good background; I've noticed especially that recording engineers -
people that work with multi-tracking music software and the layering of
sound - seem to be able to visualize a program in toto, once they're bitten by the coding bug.

Over the decades I've seen people from all walks of life with all sorts
of backgrounds end up as programmers, good and bad. I was once
responsible for a community college adult education "programming"
course, and I started the first semester with a dim view of the
potential I would be dealing with. But I was amazed at how many of
these Average Janes and Joes were good at it, and it was constantly
surprising to see who was good at what. A middle-aged matron with an
Agatha Christie jones was our best debugger, for example. Tenacious.

We never took programming very far, but it was clear from the beginning
that some members of the class had a real flair for what we were doing,
and loved it. Then there was a real interesting transition group - they
were perfectly capable of understanding the concepts and process, but
the whole business left them completely cold. And of course there were
people who never did quite get what a variable was, and left after the
first month...

What intrigued (and concerned) me most was that transition group - the
people who got it, but didn't care. They were by far the largest
segment of the class. It was then that I had my first inkling of what
the main qualification for a good programmer might be - you gotta LOVE
it. You gotta get a kick out of it. Once you have that, it's just a
matter of growth and native gifts. The ebb and flow of the business
determines where you go. But that love of the process determines how you grow.

J.Ja. starts his post by saying that it takes a special sort of person to code - "Writing
code involves a mode of thinking that is foreign to most people" was
how he put it. I used to think so too, and it pleased me greatly to
consider myself somehow special. But my experience teaching night
school stripped me of that particular conceit. Most people in that
class could code, and competently, if they thought it was important. But of those who could code, very few wanted to code.

So it isn't a "mode of thinking" that makes the difference. It's
desire, passion, interest. As a profession, we should be looking for
ways to communicate how exciting programming can be, if we want to
encourage people to understand it and enjoy it with us. I think this
might be harder than creating a list of qualifications, but maybe not.

Programming is everywhere - word macros, object scripting in games, in
3D Studio, in spreadsheets, in web pages; its all over the place, in
hundreds of variations. There's no common skill-set that encompasses my
teenaged son hacking Runescape servers AND my ex-wife's mother building
Excel macros AND me, writing real-time risk analysis software for day
traders. Sorry. The only common element is - lust. Avidity. The desire
to make something happen, the realization that you can do it, the
willingness to make the attempt...

by justin james

I think I am beginning to come to terms with AJAX. Frequent readers know how much I dislike it. Joel Splosky ("Joel On Software") wrote a good piece recently (FogBugz 4 1/2 and Subjective Well-Being) that has helped turn me around, but only slightly. Joel helped me see where my anti-AJAX crusade is unproductive. AJAX does have the right goal in mind, but I still think that it is a poor technique for accomplishing it.

What Joel (rightly) points out is something that I harp on a lot, which is that the user experience is what it is all about. AJAX holds out the promise of much quicker response to user input, which is a prime factor in user satisfaction. AJAX also allows user interactivity that traditional Web applications do not provide, such as drag and drop and right click functionality.

What Joel misses though is the technical issues with AJAX. As Roger Ramjet (frequent ZDNet commenter) says, "JavaScript is the COBOL of Web development." I would like to add to that, "AJAX is the Yugo of programming techniques." Sure, it can get you where you want to go, but you really will not enjoy the ride. In this case, the destination is a great user experience, and the ride is the development process.

When you mix "the COBOL of Web development" (JavaScript) with "the US national budget of data transfer mechanisms," (XML), you get "the Yugo of programming techniques." AJAX combines a slow language that has many mildly different implementations with a bloated way of transferring data, and tries to display it on the screen with a system that still will not reliably display the way you want it (HTML). This just makes no sense to me.

Many AJAX proponents that AJAX is the only way to achieve these goals. I believe that this is incorrect. Remember, the goal is to provide a great user experience. Does drag and drop or right click add much value to the user? Yes, but only for some users. The majority of users do not use drag and drop or right click unless they have been taught to do so in a particular application. Users are timid. They do not try things outside of the ordinary. So to add this functionality is an incredible amount of work for no gain for most users.

So I am softening my stance a bit. If AJAX can be used in a way that the problems with JavaScript and XML do not hinder it (small chunks of data, basic JavaScript functionality) then it is a perfectly fine technique to use. But to try to replicate full rich client functionality just does not work. Microsoft has discovered this with the Live.com development. They reached very far, and had to drop the XML end of things in favor of JSON; XML parsing was taking far too long on the client side. AJAX can deliver usability benefits, but only when used appropriately and carefully, and the cost of development must be weighed against the expected utility.

J.Ja

by wayne m.

It must be my old age showing, but I after reading the FogBugz link, I was thinking, "AJAX rediscovers the Function Keys!"  Remember the pre-graphics days when almost every application had line across the bottom describing what the current function of F1 - F10 (F11, F12) was? 

I think AJAX is a useful capability to allow customization at a user's desktop, but I still feel that the current HTML browser desktop is insufficient to support interactive applications.  AJAX is currently a patch over that short coming and I would rather see effort expended in defining a full featured, session-based desktop.  AJAX could then be used to adapt the desktop instead of fully implementing it.

And yes, bring back the function key row!

 

by mulkers

Ajax is scratching the surface of web 2.0. But I think Ajax is a first sign of users willing back a better ergonomy and richer GUIs. I think the A of Asynchronous is there to stay. But the Javascript in the browser does not make any sense.
If the application gets downloaded over the wire, it needs to be written in portable code running in a virtual machine or something similar.
My question is: and what do you consider as acceptable alternatives to Ajax?
Java?
Flash?
...

Robin

by info

Why not discuss Flash as an alternative to AJAX-based applications? (hey, i like AJAX, only then i mean the football team from my hometown Amsterdam...). I build RIA's (Rich Internet Applications) based on Flash and it works like a charm. Above all: one is NOT bound by the restrictions of HTML which in my opinion is unsuitable for applications. I feel that AJAX is a nice idea, but founded on the worng technology. Flash is much more suitable for webbased apps and with 98% of the users being able to view Flash content, it's a pretty cool platform for building webapplications.

by jarit1

I have been developing Ajax like applications for over 6 years and although it always seems like a great idea when I start the project, you have to take care that it doesn't become a 'golden hammer'. I have made these mistakes myself in the past where, in addition to using it in places where it really added value, Ajax was used everywhere, even on customer registration pages.

When used in the right place, Ajax can offer a great experience. However, it is my experience that the concept of parts of the code and data living on the client and parts on the server goes way over the head of many 'ordinary' web developers.

So my advice is to use it sparingly and only where there is a direct benefit for the customer. If you use it, use industry standard libraries such as Microsoft's Atlas to ensure that new team members may not need to learn your proprietary libraries from scratch.

I think what Microsoft is doing on www.live.com is not a good example of using Ajax. Sure it looks cool and is well developed from a technological point of view, but it also slows the loading of the pages and requires users to get used to yet another proprietary interface.

Some of the libraries I have created over the years are discussed on my blog at http://www.dotnetjunkies.com/weblog/jritmeijer

by just_chilin

Ajax seems to be a solution to a problem that was solved a long time ago by Java applets. If only Sun had continued improving applets. I still think applets will soon be back in style, and who knows? maybe even Swing!

by matthew22

I knew somesone would suggest Flash as an alternative -- but there's a BIG problem with Flash.

You talk about proprietary and machiavellian! Microsoft is open-source by comparison. Adobe won't even give out a command-line compiler to make .SWFs -- say I was a poor college student or independent developer, and I wanted to develop ActiveScript Flash applications using a freeware text editor. I couldn't! Now I could write in any other programming language -- PHP, any of Microsoft's .Net languages, Perl, C/C++, Java, Javascript, Pascal, you name it. Of course a fancy IDE is nice, but in many of these cases there is NO benefit to be gained by paying to become a developer!

Even before Microsoft released the "Express editions" of their .Net development software, they offered a command-line compiler so people could at least develop for .Net if they were desperate and broke. But Adobe isn't that kind to developers!

So although 98% of end-users have Flash capability, I have serious doubts that Flash will ever be popular with developers. Nothing that costs $800 to join (I'm not joking or exaggerating!) can ever be a "must-have" for a developer's resume.

Just like VCRs were optional when they cost $1000, and CD-R drives were optional when they cost $400, I'm sure Flash will always be a niche player as long as they refuse to court developers in a serious manner. And a 30-day trial is not good enough.

 

Matthew

 

by gregfuller

Matthew, there are open source compilers for flash. Also, Flex 2, which includes a very rich component set, will offer a command line compiler.  This will let you develop rich internet applications with no cash outlay

by blj

I disagree with what you are saying about AJAX. Your statement: AJAX is an expensive development for the users, where not many would know how to use drag and drop -- is rather absurd. It depends on the type of application, what type of users and how you implement interactivity.

I agree with Javascript is cumbersome, but only if don't know how to use prototype.js and/or similar tools. XML should not be named as bloated either, blame the developer, architect whoever is responsible for it.

In my application, I have AJAX with prototype.js and xml and it was added to an already working application. There is no change to the way it is used, and ofcourse it is quicker and much more usable. My work gracefully uses the old methods, if javascript is not available at the client.

AJAX is a hack that makes life a little easier. There is nothing wrong in building a rich client with AJAX. You can use it and abuse it, for e.g. Gmail, Google Calendar are good uses and Yahoo mail abuses it. 

by andy

The assertion that "the majority of users do not use drag and drop or right click" is absurd on the face of it. Virtually every user of a web browser on any computer is familiar with drag and drop and right clicking -- it's built in to the graphical user interfaces of operating systems from Linux to OSX to Windows. In fact, that is the whole point of adding such functionality to web applications: users are so familiar with drag and drop and fast responses to their actions from using desktop applications that they want to see it in their web applications as well.

Another absurd statement is that JavaScript is the COBOL of web development. If JavaScript is so primitive, why has Adobe built it into Photoshop and Illustrator and Acrobat as the default scripting engine? Why did Microsoft build it into the very heart of the way that ASP.NET works in the browser ("javascript:doPostback()" is just one example)? Why has Google had such great success using it in Google Maps and Calendar and GMail etc.? In fact, if JavaScript is so lousy, why has AJAX become so popular that Justin James has had to "soften his stance" on it even a little bit? If AJAX wasn't working, there wouldn't be a discussion. AJAX works because of JavaScript. Time for J.Ja to check the reality meter.

by compuguru

Whenever you disagree with a solution, you should give an alternative solution.  What is your alternative to AJAX?

by mattmutz

I agree that AJAX is valuable in enhancing the user experience, if it's used correctly--don't just use it for the sake of using it. Some internet users are so accustomed to web apps behaving a certain way (round trips to refresh the whole page) and might get confused if a page isn't behaving as expected because some developer wanted to showcase his mad AJAX skills.

And yes, it is bigger and more complicated than it should have to be. There's an alternative: combine Flash and XML to achieve AJAX-like functionality with far fewer lines of code, and a quicker, peppier response.

It's been done... check out free SDK and examples at http://www.fjax.net

-Mutz

by mattmutz

AJAX, when used intelligently, does help solve some of the usability issues we face when building for the web. It's not perfect, but it's worthwhile.

Building cross-browser web apps with  traditional AJAX more complicated than it should be, but there is a fast and easy alternative: FJAX (www.fjax.net).

by greg

FLASH IS THE WAY TO GO

Javascript / DOM / HTML is so unreliable it is like comparing a 70's Chevy (AJAX) with a 2k Hybrid (Flash Platform)

I cant understand why people oooo and aaaaa over simple stuff like drag and drop when it takes a monstrosity of code and time to develop with Javascript (and will still end up never working on half the known man-mdae browsers), and can be done in about 30 seconds in Actionscript.

Flash doesnt have this browser compatibility problem. Open source or not...Javascript blows ass.

by matthew22

What I would like to know --

How many fans of Flash/Actionscript actually paid the $800 out of their own pocket -- or did they get it from a wAreZ D00d?

I, for one, will not steal software.

Matthew

by apotheon

I've never seen such complete lack of understanding of the problems at hand in a discussion of web development from so many people as I've seen in the responses to this blog post. Wow, folks.

First, for J.Ja: AJAX is sort of a misnomer. Don't be fooled by the fact that it refers to "Asynchronous Javascript And XML" into believing that it's a combination of Javascript and XML designed to create a rich user environment. Google was pretty much the first major implementor of AJAX and took issue with the term AJAX specifically because of the false impression the acronym created. The only reason XML is mentioned is the use of XmlHttpRequest() in AJAX — and even that is misnamed. The whole exercise of developing and using AJAX is centered around two things. The first is Javascript as a means of execution of the concept (and this might be replaced some day if some other equally effective, efficient, and acceptable client-side scripting language becomes widely available). The second, and more central to the concept, is data transfer asynchronous with presentation via HTTP. Asynchronous data transfer capability and view rendering is something desperately needed in high-end web design and for the future evolution of web development, and as things currently stand, our only options are Javascript, Java, and Flash. As much as I dislike Javascript, it's by far a better option than Java, which in turn is by far a better option than Flash.

For the Java pushers: I don't need that kind of overhead on my system. I don't want broken functionality from the "write once, run nowhere" language. Applets sound like a great idea — too bad they were done better by Flash, and weren't even done well there. Anything that delivers an executable, inscrutable bundle of toy functionality to the client the way Java applets are delivered is a problem for performance, portability, and security, and as a result I don't even have a Java plugin for my browser installed on this system. Keep your grubby little applets out of my webpages.

For the Flash cultists: Flash is not accessible to those with disabilities. Flash is willfully designed to violate standards. Flash is proprietary and monopolistic. Flash is not fun to work with. Flash is resource-hungry, overused, slow to load, annoying, prone to resource leaks, and better suited to advertising than content. There is no Flash plugin installed on this computer either. Yes, there are open source Flash authoring tools available, and maybe some day they'll solve the problem for us, but in the meantime Flash is Adobe, not Web. Anything that doesn't degrade gracefully should never be used for web design, and Flash is the poster child for technologies that don't degrade gracefully.

By the way, that Fjax website doesn't do crap without a Flash plugin. That's bad web design.

by greg

I am with apoth on the java applets.

However im not scared of the word proprietary. you mention it as a bad thing. but cite no negative example. Open source doesnt always mean better by no means. (open standards are a must however..much like ECMA script which actionscript and javascript are based off).

as far as flash being annoying...well any sane person can argue whether that is technology or implementer...same goes with javascript and little mouse trailers that flicker in my eye balls.

Flash is fun to work with and javascript makes me want to punch babies (too much dane cook).

Many of the people that disable flash on their browsers are likely to as well jisable javscript for fear of malicious intent.

I guess the proof is in the pudding..i have seen many successfull enterprise apps in Flash...and i would laugh if you dont want to reconsider your innuendo about javascript being more processor friendly and stable than flash...(tell me jaavascript never crashed a browser)...

by Thorarinn

Anything that requires the use of the mouse and ignores the keyboard is bad practise. Unfortunately there seem to be more and more "web applications" that don't know what a keyboard is. I don't care which (flashy) "technique" was used to create those, it's crap. The most important factor in the user experience is "usability" - too many developers never seem to have learned anything about it. What's worrying is that most of those "Web 2" apps seem to take it for granted that every user is able to use a mouse.

by onefocus99

I was a Java Programmer but ran out of time to cont. I found that Flash is great and easy and quick in designing things and then you just add the code to make things work. Flash is on 99.5% of all users out there. To me, Keeping It Simple is important.
Well, that's my 2cents.

by jmgarvin

AJAX has accessability issues too.  It really bothers me that this
whole Web 2.0 is mostly not even thinking about ADA stuff, but rather
gee wiz stuff that nobody will ever use (and will be a great attack
vector).

While I like the IDEA of AJAX/SOAP/et al, the implementation leaves something to be desired.

Don't forget there are blind and blind and deaf users too...

/ Working with a blind user now
// Hates Gnopernicus
/// Speakup isn't bad
//// brltty roxors your boxors!

by mark miller

I've only read about AJAX. Once I did I cringed. Someone would have to pay me a lot of money to create one of these apps. It's nice that the option is there, but it seems like a hell of a lot of work to accomplish something that could be done so much more easily if the infrastructure was on the client. IMO that's the problem. I've got to put the blame where it belongs too: with Microsoft. They're the ones who invented the technology that enables AJAX. It's been in IE since about 1997. The programmer has to go through a lot of effort to make it work and to implement some of the more basic features that are visible to the user. It's too bad that customers are resistent to installing some sort of internet-enabled middleware, like JRE or the .Net Framework on the client. Personally I'd rather be working on a Flash client, if nothing else. At least that technology is designed for this sort of work. I'm looking forward to WPF/E, but I think it will be a while before it catches on. Customers are resistant to installing something that doesn't already come with Windows, and I'm skeptical that the uptake of Vista will be dramatic.

by justin james

jmgarvin -

I have actually been working on a blog about just that - the near impossiblity of the use of AJAX sites for handicapped people, both the cognitively handicapped (such as the blind or vision impaired) and the physically handicapped (such as those who have problems with fine motor control). The biggest obstacle is getting my hands on some screen reader software. I want to show beyond a shadow of a doubt how AJAX applications leave a significant portion of the viewers behind.

Thanks to everyone for their awesome feedback & comments!

J.Ja

by mindilator9

I take issue with the above comments concerning Flash. I do not get the impression from having read Matthew or apotheon's comments (shame on you apotheon) that you know very much about Flash at all. Yes there are open source compilers. PHP even has the ming ext. for generating swf wrappers. Flash's Remote Objects are far superior to AJAX, one reason being speed. And apotheon, I refuse to believe you've even bothered with the program when you say developing with it isn't fun. Either that or you are ready for retirement.
Adobe does not own the .swf extension. Read up, people. SWF does not stand for ShockWave Flash like you all probably think. It stands for Small Web File. Many other programs exist for creating Flash-like RIA's, such as Flex and Swish. I prefer Flash though I admit my exposure to Flex is limited. Even more promising is the amazing tool known as AMFPHP. I suggest every serious PHP developer look into this integration of PHP and Flash.
Every improvement Flash has made in its sequential versions has brought it closer and closer to a true OOP IDE that is truer, easier to use -- and above all keep organized in your head -- for making what you envision come to life. I defy anyone to name a technology that can reproduce the immersive experience of Flash. If you have complaints about what you've seen in Flash, you can 97% of the time blame the developer, not his choice of tools.
I highly suggest the book by Friends of Ed, PHP5 for Flash, as well as the myriad other books on Rich Internet Application development in Flash.
As far as I can tell, your complaints about Flash are deeply rooted in ignorance and unfounded bias. I challenge any of the users here to bring a valid, coherent argument against Flash development ("proprietary", "platform", or "not fun" arguments are neither), or the PHP/Flash model. Here, I'll help you out. I'd like to see way more functions for operating on strings and arrays in Flash. Most of this work needs to be done on the PHP side. The SharedObjects and Remote Objects are wonderful additions to the development scene in Flash, as well as the central Macromedia server.
To side with some of the dissenters on one issue, I will say that I also was not happy with Adobe's acquisition of Macromedia. This may be the only thing I think has a chance of keeping Flash from being the best alternative for web development. Adobe only ever did their Creative Suite right, which honestly has more foundation in the print world. There are some great features for creating web graphics, but consider this: A file exported for the web into .png format and imported into Flash is still larger than that same exported file opened in Fireworks and copy/pasted into Flash. In fact, the technique I just described, when the image properties are set to Lossless PNG, absolutely smashes the file size like Mario on Goomba mushroom. I've got an app whose .swf files when exported using both methods and compared showed 1.5 meg (Adobe->Import) vs. 200K (Fireworks c/p). Back to knocking Adobe, the GoLive and InMotion programs are dismal failures, and Macromedia has seen fit to hand over its gold bullion to a company I feel is historically inept with web development applications.
Ignorance of this tool is by far your greatest excuse for bashing it. Being an artist who became a programmer, I can only surmise that this is because the majority of coders have only logical skills (if that) and no creativity. You must be so intimidated by the responsibility for actual graphic design that you shun it for your dark closet of logic design. I plan to eat your lunch for dinner, and the Flash/PHP model is my barbeque pit.

by duckboxxer

Admittedly, I am only mildly watchign this, but what is the status on Flash/Flex and SEO or Section 508 compliance?  Not that Javascript is any better, but just curious.  There's a right tool for every job, and not every screwdriver fits every situation.

by mark miller

To staticonthewire:

I think you're right that passion is key. It sounds like my experience. I always had a love for machines and science. As a child I was leaning towards becoming a meteorologist. I've sometimes said that if computers didn't exist, I'd probably be one of those storm chasers now. My first encounter with a computer was mesmerizing. I was 7 or 8. Learning to program one though, at the age of 11 was intimidating. I first learned to program on computers available at my local library. What really drew me to it was seeing other people program these computers, and seeing what they were doing with them. I loved the idea of making the machine do what I wanted it to, so I kept at it. I made a LOT of mistakes. There were many days where I felt worn out and defeated, because something was going wrong with what I wrote but I couldn't figure it out. I never got to the point of giving up though. It was like an itch I had to scratch. Getting a program all debugged and running was GREAT! It was exhilerating. I think the reason it felt so great is I realized how hard it was.

Fortunately I had some help too. The library had a few computers in a room, so other people there would lend me a hand.  After a few months I finally got to the point where I could write a program on my own without much hand-holding from helpers. Then I found a programming magazine that had what were called "type-ins". They published the source code for a program, and the accompanying article explained what the code did. A great learning tool. Not too long thereafter I started writing little word game programs. Then I started writing programs with features I thought would be genuinely useful to others. Things progressed. I got my computer science degree in the early 1990s and I started working in IT software. That's where I am today.

What made programming exciting to me was 1) knowing that the option was available, and 2) I got the opportunity to watch other people program, and watch their programs evolve as they fixed bugs and added features. Most of the initial programming I saw done was in graphics or gaming. The visual aspect is very exciting, and to actually watch it work under the control of a programmer is exciting. Heck, just seeing a program run, and allow me to interact with it, got me hooked on computers as a kid. What got me programming though was seeing the cause and effect, seeing the process that a programmer goes through to get something working. Another hook for me was I could relate to the end product.

One of my first memories of watching a programmer do his thing was watching a man sitting at one of the computers. I sat there observing what he was doing. He would type things in, and then run his program, repeatedly. He had already written a fair amount of code, so a concept was there. I tried to guess what he was trying to accomplish. It looked like he was trying to create a horse racing game, but the problem he was running into was that as the horse figures moved across the screen, the old copies stayed on the screen. Secondly they went across the screen very quickly. It didn't have a sense of suspense that one expects with a horse race. The programmer was trying to figure out how to erase the old copies so it looked like movement, rather than stamping a bunch of horse figures on the screen, and how to slow it down. If he had just been working on something high level, like statistical analysis, I don't think I would've been as interested. I wouldn't have understood it at that age.

In terms of multidisciplinary qualities, I found in college that I was good at music theory. I had participated in orchestra in public school, where it was available, but I was able to understand music at a symbolic level, which is a significant part of music theory. My professor commented that he noticed over the years that people who were good in math were also good at music theory. I'd say I was good at math, but not great.

by staticonthewire

So Mark, we can agree that at least in part, the "special sauce" that makes
for a good programmer consists of the pleasure we take in the game.
From your anecdotes, I would guess that early exposure would also help,
although it doesn't seem to be required (in my case, my father was an
E.E., and I could build logic circuits before I could ride a bike). A
minimal seat-of-the-pants ease with math is probably another enabler.

But this may not be what J.Ja is after. I've been trying to understand
what he's after - why he's examining the issue at all. I thought
initially that he was trying to assemble a list of criteria that would
make it easier for him to winnow resumes while hiring. When I read
through parts 2 & 3 of his post it seemed more like he wanted to
work up some sort of syllabus or study guide that we could all use to
raise our level of competency. But in the end I can't really determine
what his context is, and that makes his post it harder to address.

I have a personal interest in the question though, which is why I
postedat all (I very seldom post on TR). I've been in the business all
my life. I remember when the cutting edge in hard drive technology
consisted of a vertical aligned ceramic coated aluminum disk that held
about 250k - you couldn't say definitely, because we all loaded our own
disk I/O programs separately, and some were built for comfort and some
were built for speed. The disks were kept under big metal hoods because
periodically the ceramic coating on those big 24" diameter disks would
disintegrate and send shards of crap flying all over the place if they
were uncovered.

So I've been in the biz for some time, and have watched lots of
programmers come and go. In all the decades I've been at it, I have
experienced almost spiritual highs in the process of
programming. Few things compare favorably to the sensation of grasping
an entire system, creating it, making it all work, and seeing it help
people. But at the same time, I've found myself increasingly isolated,
completely unable to communicate what it is that I find so terribly
consuming.

Most people seem to think that programming is something like
accounting, and their eyes glaze over when you start talking about it.
Even most people who program for a living don't get it because they're
what J.Ja calls - what was his term? It was good... oh yes - "shake n
bake" programmers. Most programmers I run into cut code 9-5 and have
never had the experiences J.Ja indicates when he lists things like AI,
device kernels and so on - at best, they have had a very limited
exposure to exploratory programming and haven't had the eureka moment -
nothing has ignited their passion; they're in the biz because the money
looked good, or because it looked too hard to study law...

For years I've tried to understand why programming - which seems to me
to be shot through with all the colors of the rainbow - can seem so
colorless to the world at large. Maybe J.Ja is barking up the same tree?

by mark miller

To staticonthewire:

Since you had trouble understanding what Justin was getting at, I think I can summarize:

The first part is philosophical. Justin is advocating for efficiency and elegance. He thinks this can only really be achieved if programmers take skills learned from other disciplines, like philosophy and math, and apply them to their work. I think he's also saying that great programmers have an intuitive sense about problems. They don't just insist that they need to go down one line of reasoning to solve a problem. They explore other possible solutions, and try to pick the best one. Perhaps the reason he thinks math helps is that it emphasizes simplification, reducing more complex mathematical expressions to simpler ones. Good math courses encourage students to search for the best rule/formula that will solve the problem. He also says they should take a scientific approach to solving problems: try an idea, and observe how well it works, repeat.

In Part 2:

He says when you are forced, in an educational environment, to try and build basic things with little to no library support, you are confronted with how to write these functions efficiently, because you end up using the functions you are building, often. This is in contrast to the "shake 'n bake" programmers he speaks of, since they're just spoon-fed the APIs, which do a lot of work for them. They don't bother to explore how the APIs they use work, and therefore don't understand their pros and cons.

He gets into code efficiency (lines of code) in his Perl example.

In his open source project example, he emphasizes the need for a consistent, structured programming style.

Next he emphasizes learning a bunch of languages, adding them to your toolbox. He suggests using different languages together, since some languages are very good at certain tasks within a project.

Lastly he says keep learning, expanding your horizons, have a passion for learning.

In Part 3:

He says good programmers think long-term, and design their software accordingly. Further, they code so others can read it.

Programmers should think about memory usage that comes as a result of their actions. He uses the example of loading up a bunch of libraries to utilize one easily replicated function. What he means is there are situations where if you load a code library to access a function, that the library will have dependencies on more libraries, which will also get loaded. If the function is simple enough to just rewrite, without all the library dependencies, then you should do that, as opposed to bringing in all that overhead.

Programmers should think of processing time for their solutions. He uses XML as an example of something that's tempting to use, but is processor-expensive. He advocates writing custom CSV code instead for transporting tabular data. The code will run faster.

Programmers should be conscious of how their language compiler/interpreter handles certain structures. Doing things that seem benign can have negative effects on performance.

In short, in this last part he's saying that programmers need to be conscious of the underlying implications of what they're doing. Logically, at a high level, everything they do makes sense, but when you dig deeper, they're creating programs that use a lot more memory than they need to, and run slower than they should. Programmers need to think about this.

Overall, he advocates for efficiency, efficiency, efficiency, and elegance. I think what Justin is also advocating is that great programmers are in a sense trained in computer science, because everything he advocates is taught in a good CS curriculum: good structured code, descriptive variable names (and comments--he didn't mention this), emphasis on efficient use of algorithms, learning how to write efficient code, learning how programs execute, and how compilers/interpreters translate/execute programs, learning a variety of programming languages and see how each has certain advantages and disadvantages, and learning how to use different programming languages together (at least they used to teach this).

In all the decades I've been at it, I have experienced almost spiritual highs in the process of programming. Few things compare favorably to the sensation of grasping an entire system, creating it, making it all work, and seeing it help people. But at the same time, I've found myself increasingly isolated, completely unable to communicate what it is that I find so terribly consuming.

Huh. I would've thought the people who got into it for the money would be long gone by now. IT hasn't been the best place to be in terms of worker morale and pay.
Interestingly the only programmers I've met who for the most part see the programming world as "colorless", as you put it, are female. I haven't met many female programmers, and the few I've talked to have other interests they're more passionate about. I've asked them if they've written programs on their own time. Without fail they've said no. In fact they think I'm strange for asking the question, like, "Why would I want to do THAT?" One lady I asked thought of programming like accounting, just like you said. So I could understand why she wouldn't see it as a recreational activity. This isn't to say they were necessarily bad programmers or unskilled. They just didn't have the passion for it. Please understand I'm not trying to cast aspersions on all female programmers. I wish there were more of them in our profession. This has just been my experience.

For years I've tried to understand why programming - which seems to me to be shot through with all the colors of the rainbow - can seem so colorless to the world at large. Maybe J.Ja is barking up the same tree?

I think you are both barking up the same tree. He's describing the frustration he's encountered from dealing with people who are programmers but care only enough to meet the minimum standards necessary to not get fired. They don't have any ambition to become better programmers. To them it's just a job. They don't care about the craft.

Just recently I read some articles by Joel Spolsky, Paul Graham, and others who complain about something similar to what you and Justin have talked about. They take a slightly different tact in they put the blame squarely on the Java programming language. They claim that Java enabled schools to spring up that teach people just enough to get something done, but otherwise they produce programmers who are unenlightened and messy. They blame Java, because they claim it handles all the messy stuff that programmers used to have to worry about, like memory management. Come to think of it, I don't understand why they don't direct their ire at Visual Basic as well. It shares some of these qualities with Java, not to mention .Net. On the upside for corporations, they said, Java enabled a lot more programmers to be produced. During the '90s this was seen as a boon, since companies complained of a shortage (they still do). The result though, they said, was a lot of second-rate software, failed projects, and failed companies.

If you're interested, the web page that directed me to these articles is at: "Why Java is not my favorite programming language" http://web.onetel.net.uk/~hibou/Why%20Java%20is%20Not%20My%20Favourite%20Programming%20Language.html

Interestingly, several of these authors had good things to say about Lisp, especially Paul Graham, who is a Lisp advocate. Graham's account of his use of Lisp in his start-up years ago, called ViaWeb (now Yahoo! Store), is compelling.

I programmed in Lisp a bit in college, but it was so alien to me, plus I had a terrible teacher for the class, and the materials I was given to learn with were not good. It turned me off to Lisp. But these guys convinced me to give it a second chance. I've been taking up learning it again just recently. The selling points for me were that Lisp has been, and continues to be used in some real world projects, and not just for AI. Secondly, at least one of the folks said that Lisp is a good language to learn, because it teaches you to be a better programmer, even if you never end up using it in a real project, like what Justin said about exposure to mathematics. The disadvantage Lisp has is most programmers don't know it, or avoid it, due to it being so different from the dominant languages. A few who have tried it complain that it lacks robust tool and library support.

by mark miller

To staticonthewire:

Since you were having trouble understanding what Justin was getting at, I believe I can summarize:

The first part is philosophical. Justin is advocating for efficiency and elegance. He thinks this can only really be achieved if programmers take skills learned from other disciplines, like philosophy and math, and apply them to their work. I think he's also saying that great programmers have an intuitive sense about problems. They don't just insist that they need to go down one line of reasoning to solve a problem. They explore other possible solutions, and try to pick the best one. Perhaps the reason he thinks math helps is that it emphasizes simplification, reducing more complex mathematical expressions to simpler ones. Good math courses encourage students to search for the best rule/formula that will solve the problem. He also says they should take a scientific approach to solving problems: try an idea, and observe how well it works, repeat.

In Part 2:

He says when you are forced, in an educational environment, to try and build basic things with little to no library support, you are confronted with how to write these functions efficiently, because you end up using the functions you are building, often. He says this to contrast against the "shake 'n bake" programmers, because they're just spoon-fed the API. They haven't looked deeply into the API, or read up on them, to consider the pros and cons of certain functions.

He gets into code efficiency (lines of code) in his Perl example.

In his open source project example, he emphasizes the need for a consistent, structured programming style.

Next he emphasizes learning a bunch of languages, adding them to your toolbox. He suggests using different languages together, since some languages are very good at certain tasks within a project.

Lastly he says keep learning, expanding your horizons, have a passion for learning.

In Part 3:

He says good programmers think long-term, and design their software accordingly. Further, they code so others can read it.

Programmers should think about memory usage that comes as a result of their actions. He uses the example of loading up a bunch of libraries to utilize one easily replicated function. What he means is there are situations where if you load a code library to access a function, that the library will have dependencies on more libraries, which will also get loaded. If the function is simple enough to just rewrite, without all the library dependencies, then you should do that, as opposed to bringing in all that overhead.

Programmers should think of processing time for their solutions. He uses XML as an example of something that's tempting to use, but is processor-expensive. He advocates writing custom CSV code instead for transporting tabular data. The code will run faster.

Programmers should be conscious of how their language compiler/interpreter handles certain structures. Doing things that seem benign can have negative effects on performance.

In short, in this last part he's saying that programmers need to be conscious of the underlying implications of what they're doing. Logically, at a high level, everything they do makes sense, but when you dig deeper, they're creating programs that use a lot more memory than they need to, and run slower than they should. Programmers need to think about this.

Overall, he advocates for efficiency, efficiency, efficiency, and elegance. I think what Justin is also advocating is that great programmers are in a sense trained in computer science, because everything he advocates is taught in a good CS curriculum: good structured code, descriptive variable names (and comments--he didn't mention this), emphasis on efficient use of algorithms, learning how to write efficient code, learning how programs execute, and how compilers/interpreters translate/execute programs, learning a variety of programming languages and see how each has certain advantages and disadvantages, and learning how to use different programming languages together (at least they used to teach this).

In all the decades I've been at it, I have experienced almost spiritual highs in the process of programming. Few things compare favorably to the sensation of grasping an entire system, creating it, making it all work, and seeing it help people. But at the same time, I've found myself increasingly isolated, completely unable to communicate what it is that I find so terribly consuming.

Huh. I would've thought the people who got into it for the money would be long gone by now. IT hasn't been the best place to be in terms of worker morale and pay.

Interestingly the only programmers I've met who for the most part see the programming world as "colorless", as you put it, are female. I haven't met many female programmers, and the few I've talked to have other interests they're more passionate about. I've asked them if they've written programs on their own time. Without fail they've said no. In fact they think I'm strange for asking the question, like, "Why would I want to do THAT?" One lady I asked thought of programming like accounting, just like you said. So I could understand why she wouldn't see it as a recreational activity. This isn't to say they were necessarily bad programmers or unskilled. They just didn't have the passion for it. Please understand I'm not trying to cast aspersions on all female programmers. I wish there were more of them in our profession. This has just been my experience.

For years I've tried to understand why programming - which seems to me to be shot through with all the colors of the rainbow - can seem so colorless to the world at large. Maybe J.Ja is barking up the same tree?

I think you are both barking up the same tree. He's describing the frustration he's encountered from dealing with people who are programmers but care only enough to meet the minimum standards necessary to not get fired. They don't have any ambition to become better programmers. To them it's just a job. They don't care about the craft.

Just recently I read some articles by Joel Spolsky, Paul Graham, and others who complain about something similar to what you and Justin have talked about. They take a slightly different tact. They put the blame squarely on the Java programming language. They claim that Java enabled schools to spring up that teach people just enough to get something done, but otherwise they produce programmers who are unenlightened and messy. They blame Java, because they claim it handles all the messy stuff that programmers used to have to worry about, like memory management, but it leads to carelessness. Come to think of it, I don't understand why they don't direct their ire at Visual Basic as well. It shares some of these qualities with Java, not to mention .Net. On the upside for corporations, they said, Java enabled a lot more programmers to be produced. During the '90s this was seen as a boon, since companies complained of a shortage (they still do). The result though was a lot of second-rate software, failed projects, and failed companies. They also emphasize the virtues that are taught in the older computer science curriculum. One of them claimed that Java has kind of corrupted computer science at universities, because it de-emphasizes some of the old virtues.

If you're interested, the web page that directed me to these articles is at: "Why Java is not my favorite programming language" http://web.onetel.net.uk/~hibou/Why%20Java%20is%20Not%20My%20Favourite%20Programming%20Language.html

Interestingly, several of these authors had good things to say about Lisp, especially Paul Graham, who is a Lisp advocate. Graham's story of his start-up where he used Lisp extensively years ago, called ViaWeb (now Yahoo! Store) is compelling.

I programmed in Lisp a bit in college, but it was so alien to me, plus I had a terrible teacher for the class, and the materials I was given to learn with were not good. It turned me off to Lisp. But these guys convinced me to give it a second chance. I've taken up learning it again recently. The selling points for me were that Lisp has been, and continues to be used in some real world projects, and not just for AI. Secondly, at least one of the folks said that Lisp is a good language to learn, because it teaches you to be a better programmer, even if you never end up using it in a real project, like what Justin said about exposure to mathematics.

by mark miller

To staticonthewire:

Since you were having trouble understanding what Justin was getting at, I believe I can summarize:

The first part is philosophical. Justin is advocating for efficiency and elegance. He thinks this can only really be achieved if programmers take skills learned from other disciplines, like philosophy and math, and apply them to their work. I think he's also saying that great programmers have an intuitive sense about problems. They don't just insist that they need to go down one line of reasoning to solve a problem. They explore other possible solutions, and try to pick the best one. Perhaps the reason he thinks math helps is that it emphasizes simplification, reducing more complex mathematical expressions to simpler ones. Good math courses encourage students to search for the best rule/formula that will solve the problem. He also says they should take a scientific approach to solving problems: try an idea, and observe how well it works, repeat.

In Part 2:

He says when you are forced, in an educational environment, to try and build basic things with little to no library support, you are confronted with how to write these functions efficiently, because you end up using the functions you are building, often. He says this to contrast against the "shake 'n bake" programmers, because they're just spoon-fed the API. They haven't looked deeply into the API, or read up on them, to consider the pros and cons of certain functions.

He gets into code efficiency (lines of code) in his Perl example.

In his open source project example, he emphasizes the need for a consistent, structured programming style.

Next he emphasizes learning a bunch of languages, adding them to your toolbox. He suggests using different languages together, since some languages are very good at certain tasks within a project.

Lastly he says keep learning, expanding your horizons, have a passion for learning.

In Part 3:

He says good programmers think long-term, and design their software accordingly. Further, they code so others can read it.

Programmers should think about memory usage that comes as a result of their actions. He uses the example of loading up a bunch of libraries to utilize one easily replicated function. What he means is there are situations where if you load a code library to access a function, that the library will have dependencies on more libraries, which will also get loaded. If the function is simple enough to just rewrite, without all the library dependencies, then you should do that, as opposed to bringing in all that overhead.

Programmers should think of processing time for their solutions. He uses XML as an example of something that's tempting to use, but is processor-expensive. He advocates writing custom CSV code instead for transporting tabular data. The code will run faster.

Programmers should be conscious of how their language compiler/interpreter handles certain structures. Doing things that seem benign can have negative effects on performance.

In short, in this last part he's saying that programmers need to be conscious of the underlying implications of what they're doing. Logically, at a high level, everything they do makes sense, but when you dig deeper, they're creating programs that use a lot more memory than they need to, and run slower than they should. Programmers need to think about this.

Overall, he advocates for efficiency, efficiency, efficiency, and elegance. I think what Justin is also advocating is that great programmers are in a sense trained in computer science, because everything he advocates is taught in a good CS curriculum: good structured code, descriptive variable names (and comments--he didn't mention this), emphasis on efficient use of algorithms, learning how to write efficient code, learning how programs execute, and how compilers/interpreters translate/execute programs, learning a variety of programming languages and see how each has certain advantages and disadvantages, and learning how to use different programming languages together (at least they used to teach this).

In all the decades I've been at it, I have experienced almost spiritual highs in the process of programming. Few things compare favorably to the sensation of grasping an entire system, creating it, making it all work, and seeing it help people. But at the same time, I've found myself increasingly isolated, completely unable to communicate what it is that I find so terribly consuming.

Huh. I would've thought the people who got into it for the money would be long gone by now. IT hasn't been the best place to be in terms of worker morale and pay.

Interestingly the only programmers I've met who for the most part see the programming world as "colorless", as you put it, are female. I haven't met many female programmers, and the few I've talked to have other interests they're more passionate about. I've asked them if they've written programs on their own time. Without fail they've said no. In fact they think I'm strange for asking the question, like, "Why would I want to do THAT?" One lady I asked thought of programming like accounting, just like you said. So I could understand why she wouldn't see it as a recreational activity. This isn't to say they were necessarily bad programmers or unskilled. They just didn't have the passion for it. Please understand I'm not trying to cast aspersions on all female programmers. I wish there were more of them in our profession. This has just been my experience.

For years I've tried to understand why programming - which seems to me to be shot through with all the colors of the rainbow - can seem so colorless to the world at large. Maybe J.Ja is barking up the same tree?

I think you are both barking up the same tree. He's describing the frustration he's encountered from dealing with people who are programmers but care only enough to meet the minimum standards necessary to not get fired. They don't have any ambition to become better programmers. To them it's just a job. They don't care about the craft.

Just recently I read some articles by Joel Spolsky, Paul Graham, and others who complain about something similar to what you and Justin have talked about. They take a slightly different tact. They put the blame squarely on the Java programming language. They claim that Java enabled schools to spring up that teach people just enough to get something done, but otherwise they produce programmers who are unenlightened and messy. They blame Java, because they claim it handles all the messy stuff that programmers used to have to worry about, like memory management, but it leads to carelessness. Come to think of it, I don't understand why they don't direct their ire at Visual Basic as well. It shares some of these qualities with Java, not to mention .Net. On the upside for corporations, they said, Java enabled a lot more programmers to be produced. During the '90s this was seen as a boon, since companies complained of a shortage (they still do). The result though was a lot of second-rate software, failed projects, and failed companies. They also emphasize the virtues that are taught in the older computer science curriculum. One of them claimed that Java has kind of corrupted computer science at universities, because it de-emphasizes some of the old virtues.

If you're interested, the web page that directed me to these articles is at: "Why Java is not my favorite programming language" http://web.onetel.net.uk/~hibou/Why%20Java%20is%20Not%20My%20Favourite%20Programming%20Language.html

Interestingly, several of these authors had good things to say about Lisp, especially Paul Graham, who is a Lisp advocate. Graham's story of his start-up where he used Lisp extensively years ago, called ViaWeb (now Yahoo! Store) is compelling.

I programmed in Lisp a bit in college, but it was so alien to me, plus I had a terrible teacher for the class, and the materials I was given to learn with were not good. It turned me off to Lisp. But these guys convinced me to give it a second chance. I've taken up learning it again recently. The selling points for me were that Lisp has been, and continues to be used in some real world projects, and not just for AI. Secondly, at least one of the folks said that Lisp is a good language to learn, because it teaches you to be a better programmer, even if you never end up using it in a real project, like what Justin said about exposure to mathematics. I've read a few complaints that Lisp does not have robust tool and library support. Plus there are not that many programmers who know Lisp. They either don't know about it or avoid it, probably because it's so different from the dominant languages out there.

by justin james

Mark -

You summarized my thoughts perfectly, and you are spot on with where I was going with all of this. I am currently working on another post regarding the emotional involvement with coding.

Joel Splosky and Paul Graham are both two excellent people to be reading. In my most recent blog, I used one of Joel's recent postings to soften my anti-AJAX stance a bit. He reminded me that the users do not really care what is happening, as long as it works well for him.

I never had any direct Lisp experience, but EdScheme is a version of Scheme, which is a Lisp derivitive. Mr. Graham's writings have made me very curious about Lisp, and I would like to know more about it. Sadly, the work I get paid to do during the day is just not something that I would ever get to use Lisp with (I spent more of my programming time in VB.Net or VBA, bleh), and my personal time is extremely compressed at the moment. I am taking the chance to experiement a bit with F# (Microsoft's version of O'Caml), since it is easy for me to disguise "learning something new" as "learning to do things better" if it is occuring within a Microsoft environment.

To all of the people commenting on this blog, thanks for the great discussion! This is the smartest and best discussion I have seen on this site since the "Could AI Ever Happen?" discussion.

J.Ja

by justin james

There was a lot of fantastic feedback from readers regarding my recent series, "How to Think like a Programmer" (Part 1, Part 2, and Part 3). Two readers, staticonthewire and Mark Miller made some extremely astute comments regarding the role of emotions. The series left out emotions, but that is not to say that they do not play a role. staticonthewire remarked that, contrary to my example, he has met scientists who made lousy programmers ? and a mystery novel buff who was fantastic, and that the difference was passion for programming.

I cannot agree more. A programmer who treats their job as a way to make money and nothing more will rarely offer make than what they are asked to give. These are the programmers who churn out mediocre code on a mediocre project, do not involve themselves in making better software, just meeting the project specs, and so on. The programmers that are passionate about technology and code writing are the ones who will go home and research the best way of doing something, write code in their spare time, learn new things after hours, and more. These are the programmers you want to hire.

My initial experiences with programming were amazing. I loved having a problem to try to solve, and figuring out the solution using nothing more than my own wits. We did not have Internet then, the answers were not a Web search away. You succeeded or failed based upon the knowledge, experience, and skill of yourself and the people you were working with. The debugging tools were primitive at best; dumping variable state information to the screen or a file was the best and easiest way to see what was happening at run time. Frequently, I would print out all of my source code, and follow it through by hand, inventing user input and seeing how the code operated in response. I could not have been happier.

What I love about writing code is the nitpicking and problem solving. A few days ago, someone asked me to describe what it is like to do my job. I told them, "I am a professional nitpicker. Every detail counts. On top of that, my job is to think of the craziest way someone could use my product, and then have it continuing functioning." I think that sums it up pretty nicely. I enjoy programming for the same reasons that I enjoy reading great books, doing crossword puzzles, listening to "artsy" music, looking at modern art, and watching David Lynch films. It is really all the same type of thinking, just a different medium.

It seems that in the last ten years or so, colleges started moving away from teaching Computer Science as an offshoot of mathematics, as a mostly theoretical discipline, to teaching Computer Science as a vacation. Instead of learning about "big endian systems," "O numbers," formal logic, and so forth, CS students are being taught how to write code in Java, SQL, and other languages. They are being given a four year education in "best practices." These are "shake and bake programmers." The passion, the excitement of solving problems has been taken away, to be replaced by painting by the numbers. The worst part about being taught programming at the vocational level, is that the industry changes rapidly enough that whatever you learned is going to be outdated by the time you graduate. Chances are, it was outdated by the time it got into the curriculum.

Programming is increasingly a matter of gluing together libraries written by a few select people, the ones who are having all of the fun. At this point, the places where truly interesting codesmithing seems to occur is in the shops making development tools (Sun, Microsoft, Borland, etc.) and the small places doing niche work. Some of the FOSS projects are extremely interesting as well, and they have the advantage of not caring about profits, so they are free to work on unusual and creative projects regardless of potential market size. Anyone in between these types of environments is just gluing together libraries written by a big-time player into a standard, boring C/R/U/D application.

One thing I have found over the years is that when I am enjoying myself at my job and being challenged, the passion is there. Put me on a tight deadline to come up with something that seems impossible, and you get great results. If you hand me a project with a long deadline and involves zero creativity or problem solving, it is likely that I will enjoy myself as much and the project will drag. The passion just cannot exist for a dull project. I think this is one of my big concerns with the IT industry. There was an extremely long period of time where things were being changed constantly, and when a piece of software or hardware, or a way of doing things became obsolete, it was replaced by something markedly better and more interesting, and more pleasant to work with. Every day brought exciting change.

It is a shame that the world of programming seems to be moving slowly towards "shake and bake" code. Maybe the direction will reverse? I certainly hope it will! I am passionate about programming. I am one of those twisted individuals who writes code in their spare time. I rarely have a day truly off of work, because even when I have the day off I cannot resist popping onto the VPN and doing a few things. For me, writing code is like playing Civ III, but instead of "just a few more turns!" it is "just one more subroutine!" When a project is rolling, I have been known to spend 16, 24, sometimes 50 hours straight at the office working on it (they know better than to make comments about the smell, and to just smile and appreciate the results). This is not too uncommon for programmers to do, and has been the source of jokes for decades. How many other jobs are notorious for having these types of things happen? Let's hear it for passionate programmers would wide, and give ourselves a hand.

J.Ja

by mark miller

Passion can be applied in different ways. I enjoy .Net quite a bit, but only because it supports my application development efforts better than past tools/environments I've used. Since my interest in Lisp has been piqued, I've thought about the idea of including it in future .Net projects (support for that exists) where most of the code is written in C#. I think where it might come in handy is in dealing with some thorny algorithmic problem. The only thing I'd be worried about is if I'd be allowed to do it. I think most employers/customers (if they chose to be aware of such things) would be wary of that, because they might be worried about being able to maintain the code in the future.

I've worked in MFC for a while (about a year and a half), and I don't appreciate it as much as what .Net offers. If I had all the time in the world I might prefer working in C++ for some projects. I find that it's more difficult to move the ball forward with it, but you do get faster programs.

My interests lie in building applications with business logic involved, writing code libraries and utilities, and in programming languages.

One of my first jobs out of college was working on a script interpreter for a report generator. It was challenging but very engaging for me. Unfortunately it was all dependent on an in-house customized database structure. When we found out the system was just not going to serve the customer's needs, we dropped it, along with the report generator project. If there's one thing I hate more than anything else is working on a project that doesn't get used. I'd like my work to count for something. We ended up switching to using Windows 3.11 and a relational database model. I worked on that for a bit in C, and it was very interesting. There was a lot to learn, I liked the support that Windows had, and the visual GUI aspect was a real hook for me. We also made faster progress in getting the project done. That was nice. We had less budgetary pressures.

Having code library support isn't such a bad thing. What I bring to my work is the knowledge I gained from not having that support. In the line of work I'm in though, I would never want to work on a project solely using technology that had minimal tool and library support. A project like that would have "death march" written all over it. I'm not trying to say that's a universal truth. Obviously if someone's working on a totally innovative concept, then of course the library support is going to be minimal, but that involves working on a project with a timeline and expectations that are very different from the projects I work on.

Like I said I like working on code libraries and utilities, too. I've had a few rare opportunities to work on such things. They give me an opportunity to work on purely geeky design issues. Not that I don't like visual design as well. It's just different.

Since I got out of college I've worked on custom business applications, and they've usually involved working with a database. I think the work suits me well. I like the variety.

I think you're right that the CRUD work is the most boring. As I was writing this I was thinking about past projects I've worked on, and the most boring aspect of a job role I had at one of my past employers, back in the mid- to late-90s, was where I spent most of my time doing CRUD work in C. It was challenging at first because what I did involved validating the referential integrity of data. Pretty laborious, and you have to be meticulous about it, lest you miss something. There came a point though where I wanted to get out of doing that SO badly. One approach we tried was making the code object-oriented in C++, since I noticed that a lot of the C code I was working on was just repeating patterns. That would've at least given me a creative opportunity to try and automate the CRUD process a little more. But that got abandoned when we realized that in reality C++ on Unix was not as standardized as we would've liked. Every customer had a different system with a different C++ compiler (if it was even installed), and none of them were guaranteed to have the same feature sets, like universal support for templates and all their features. By then ANSI C was rock solid. It was supported on every system. I eventually quit the job because it was holding me back.

Nowadays I try to find interesting projects, ones that have CRUD as a component (I like database applications and this goes with the territory), but involve significant business logic, or working with a technology I've never tried before. .Net has made dealing with CRUD easier (love them data adapters!). I try to use data adapters judiciously. There are times when using a Command object and a DataReader is better suited to the task. .Net 2.0 makes dealing with CRUD even easier, from what I understand, since it supports two-way databinding. That's something to look forward to. The less I have to deal with it the better.

by justin james

Mark -

You are 100% right about .Net and the C/R/U/D! I am not a huge fan of VB.Net or C# because I think that they are fairly weak as languages, but I really, really like the .Net Framework, as it does so much to alleviate the hassle of dealing with data. I have found though, that the weakness of the "big two" .Net languages, once the C/R/U/D parts are finished, actually slows down a project. I think there is probably a ratio of business logic to data work at which VB.Net and C# turn around and become less efficient to work in. I am rather grateful that all of the .Net work I have done has not hit that point.

I was really disappointed in ActiveState's Perl for .Net (in the PDK). I was hoping for something that would seamlessly plug in to Visual Studio and let me work from there; instead, it just compiles a DLL that "talks .Net." It would have been a great opportunity to bring a truly elegant, powerful language to .Net, and help bridge the gap, but instead it just does not work. The strength of .Net, as well as Visual Studio (indeed, every in the modern Microsoft universe) is that it all ties together so nicely. Despite all of the inefficiencies and hassles involved a lot of the time, it really does take away much of the "busy work" of building an application. But to make a system where some of the code gets written and compiled outside of the Visual Studio system just does not work for me.

I am seriously looking into F# (Microsoft's implementation of O'Caml, plugs right into Visual Studio) as I want to be using a dynamic language with support for eval(), and the PDK is not where it's at for me. I will be blogging soon about F#, once I have some time to build a few small things with it. I would also like to see a Lisp that plugs into VS for the same reasons you want to work with Lisp. For any kind of complex business logic, Lisp, Perl, and other interpreted languages are the best thing going, especially if you can deliver a customized file of modules to individual users or customers, and have the compiled end of the application be a framework. This is where I am headed with my applications, as I have customers who all want the same application, but have radically different business rules, and I simply cannot maintain a separate code base for each customer. My only other real option (and considering what I am working with, it is not very viable) is Web-based applications in an interpreted language, which sticks me with either Perl (too much effort on the C/R/U/D end) or PHP (bleh, all around).

J.Ja

by mark miller

I've found Two Lisp.Net languages, but they don't integrate with VS. They do however provide script engine capabilities. They are:

L# - by Rob Blackwell - www.lsharp.org

According to the author it's supposed to be a .Net implementation of ARC, which is a Lisp-like language. It has an eval function, and can be used as a script engine inside your own program, coded in C# or VB.Net. It also has a command-line interpreter so you can try out code.

DotLisp - by Rich Hickey - http://dotlisp.sourceforge.net/dotlisp.htm

Has an eval function in the language. Looks to have more meat to it in terms of operators it supports, and provides more scripting and interop support. It is not a faithful implementation of any standard Lisp. Instead its stated purpose is to be a "Lisp for .Net". So it has some .Net characteristics that are not compatible with standard Lisp. You can use it as a script engine for your application. In addition it provides a facility so that you can provide hooks into your own C# or VB.Net code, accessible by the script. You can either feed it a script from within your own code, or have it load a script file and run it. It also has an interactive interpreter so you can try out Lisp code at a command line.

GotDotNet has a bunch of .Net versions of programming languages. The only functional programming language I've found in their list so far that integrates with VS (besides F#) is SML.Net. At least it says it integrates. There's a version of it you can download that contains the extra VS integration stuff.

I remember using SML while in college. I found it to be an understandable language. It had enough of a procedural feel that it wasn't a total culture shock, though it seemed more geared to pattern matching, a bit like Prolog.

You might also be interested in looking at some of the other language projects that GotDotNet lists on its .Net Language Developers Group page at: http://www.gotdotnet.com/team/lang/

The languages it lists (beyond the ones we've already mentioned) are:

.Net IL Assembler
Ada
APL
AsmL - the Abstract State Machine Language
Cobol - from Fujitsu
Delphi - from Borland
Forth
Eiffel
Fortran (2 versions)
Haskell
Lua - embedded scripting language
Mercury
Mixal
Mondrian
Nemerle - a hybrid functional/OO language
Oberon
Pascal
PHP#
Prolog (compiles Prolog to C#)
Python
RPG
Ruby (an interpreter, and a Ruby/.Net bridge)
Scheme (2 versions)
Smalltalk (2 versions - one says it's a compiler)

by billt174

Ihave been known to spend 16, 24, sometimes 50 hours straight at the office working on it

 

Sounds like you need a life.

Don't mistake passion for obsession. The reason you are on this planet is not to make software it's to make love, make friends, make food...

Making software should be just a job not a life.

by snoopdoug

I'm one of those who graduated in the day when CS meant computer science--learning algorithms, order of, NP, etc. Wrote my own b-tree balancing code, quicksort, etc. Did it make me a better developer? Heck if I know. It is axiomatic that whatever path led to your success is the "One True Path" (tm). Good developers are made. Most developers would like to have exciting and challenging jobs, but that's not going to happen, that's why it's called "work" and not "fun" and why we get paid.

Sweating the details is a crucial part of being a developer. Maybe more so than liking to solve puzzles. You bet the job gets tedious, but tell me one job that does not have tedium. If you enjoy the intellectual challenges of development, you must also tolerate the periods of boredom and push yourself through.

Now don't get me started on meetings...

doug in Seattle

by apotheon

I'm kind of disturbed by the concept of L#. I wonder how there can be a functional .NET implementation of Arc, considering that Arc isn't finished yet (and doesn't have a projected finish date, either). Sure, Paul Graham has written a very effective heuristic spam filter in a working version of Arc, but the language still simply isn't nailed down.

I'd be more inclined to go with one of the .NET Scheme implementations, at least until Arc is approaching completion. L# is likely to suffer from being trapped between the unpopularity of Lisp in the .NET community and the looming specter of an evetually-finished Arc, and thus will likely never mature much because it just won't get the kind of development attention it needs — at least until Arc is finished, and even then only if L# keeps pace with Arc. Keeping pace with Arc presents its own problem, of course, because it means that the parser is a moving target for L# programmers.

Yeah, go with a .NET Scheme implementation instead, I think.

by emanueol

:)

I love programming since 12 years old (Sinclair machines) because Programming give us the chance to change the world without needing anything/anyone else.

Machines don't make our life hard as most people do directly with their social/influential schemes.. This seems a bit filosofical, but hey, it's something I felt young and now it has being democratized by giving Internet to people.. seems humans using computers as proxies to other humans makes sence, maybe because we all together are part of a super wider being (I call it "the super being"), that is like a human/emotional network connecting all people. So, Internet just allowed that biological human feature to work in a daily basis and widespread to everybody in the world. We are all nodes on a bigger emotional network (some people and religions call this.. God) :)

Getting back on my comment -> Or in other words, we are completely independent (we just need electricity to work/live), in order to build abstract universes (a bit like acting as God.. hmm god again lol) but powered with a non-selfish mission statement of "help the biggest number of humans as possible, by doing something I love".

All the biggest social/economical impact events ALWAYS arised/arise from a small number of passion people (1? 2? e?) that believe in something, work hard on putting in real world their ideas and feelings, and because there was Emotions as the genesis motivation, of course everyone that will use their solution will indirectly feel the same emotions (beeing it to build the first Plane, Ford: the first car, Sinclair with home computers), so programming give us the same type of means but with the advantage that it's 100% money free, you don't need to buy wood, iron, and raw materials to build things :)

Only now, in the XXI century the business-world is understanding that after all life is all about emotions.

I feel very happy with the advent of Internet, since it brought to non-programmers humans beings the same strong feeling I felt with 12 years old when I had my first ZX80 :) I'm sure the majority of programemers also share this feeling :)

Check Google 70%-20%-10% types of time use at work, for example (70% for "normal" project development - execute Managers strategy; 20% work  on your own internal project YOU like; 10% for sports/leisure/sleeping/etc..)

And, I got a friend of mine that just made a PhP on NetValue involving emotions; proximity networks etc.. that is already thinking that "the way" for employees to use their time at work is a even more ambicious rule 80%-20% squeme (80% work on whatever you want, we provide you with the resources + 20% hey! show us how evolving is your dream coming :)... hmm... I guess that's why Open Source has evolved so much :) In the future, products will be free, people will only pay for services. And that's the way to achieve Quality of Life for everyone.. it doesn't make sense for the human race to work as slaves to something called "Enterprises/Companies".. hey, hello?!.. it's supposed to be the other way round.. People working for people.. and Internet - once again - allowed and it continues to evolve the world to this new model era.

Ok, over and out, Love, Cheers and May the Force Be With You Always ~

Emanuel Oliveira

 

 

by staticonthewire

Mark, I appreciate the trouble you took to summarize J.Ja's post. To clarify, I wasn't having trouble understanding J.Ja's content (although your summary was very comprehensive). I was having trouble understanding the why behind the content - why he thought his quest for "what goes into a top-flight programmer" might bear significant fruit.

As I emphasized (I believe in my first and second posts) there are
few, if any, comprehensively useful programmer characteristics that I
can identify. Even the efficiency and elegance that J.Ja admires can be
a liability in a large shop, where individual elegance and efficiency
can explode an operations' overall efficiency. I addressed the futility of efficiency in this context with the example of the cobbler, if you recall.

So my puzzlement with J.Ja's post was not with the content - Justin
writes with concision and cogency and puts things in ways that makes
them easy to understand. Your summary was an equally clear distillation
of his presentation. But neither you or he managed to address my
puzzlement - trying to define something like this seems impossible, so
why...?.

The futility of developing a comprehensive "list" of good programmer
characteristics or skills or activities led me to pondering the
underlying issue, which to me brings us to the whole business of
passion, of loving what you do, and personally, I think that's about as
far as it can realistically be taken.

For the record, my own tendencies are very much like J.Ja's - I've
worked with many languages, some by fiat but most by choice, and have a
strong background in basic science and math and would heartily endorse
most of his recommendations. But none of them will mean anything
without a deep desire to explore this art of ours (maybe someday it
will evolve into a science...).

"Huh. I would've thought the people who got into it for the money
would be long gone by now. IT hasn't been the best place to be in terms
of worker morale and pay."

Yeah, well, I didn't say they were RIGHT. I just said that was their motivation...

BTW, I know many woman programmers, and IMHO the range of excellence is
about the same as in men - 10% clueless, 80% "shake-n'bakers", 10%
genuine coin / the real deal / exploratory programmers. I've pulled an
infinite number of all-nighters (no really - I counted) with very
capable coders, women and men , and I can't say I've seen any
difference in competence or dedication.

I do notice that there are variations in emphasis and focus, but no
more than I would expect from critters as different as men and women.
I've noticed the same sort of variation between Russian programmers,
say, and programmers from the US or Japan. Cultural artifacts affect
how problems are approached, but the random walk we all perform seems
to bring us all to the same sorts of solutions...

"I think you are both barking up the same tree. He's describing the
frustration he's encountered from dealing with people who are
programmers but care only enough to meet the minimum standards
necessary to not get fired. They don't have any ambition to become
better programmers. To them it's just a job. They don't care about the
craft."

Oh, I share his frustration, believe me. There is nothing worse than
starting a project full of fire and realizing by the end of the first
week that the team with whom you're saddled consists of three
shake-n-bakers, a glorified word processor, two interns who just
finished their first "computer" course in community college and one
brilliant but completely warped programmer who frames all his function
calls in the form of koans that no one else can understand and is
deeply involved in completing a sculpture on his desk made of the
carefully preserved bodies of cockroaches he's trapped under his desk...

Whatever Spolsky & Graham et al may say, Java is not the root of
all evil, nor is VB, or .NET or anything else. I use all these
technologies competently and if I do say so myself, with real flair.
I love Java, and VB and javascript too - hell, I still have a soft spot
for Algol... the problem isn't with the tech, the problem is with the
people, as always. If we ever get to the point where we have a
foolproof language we'll find that it has a terribly limited array of
solutions it can present. If you don't have enough rope to hang
yourself, you don't have enough to save your ass, either. Or even solve
your programming problem...

There are always people grumbling about how easy kids have it these
days, they don't have to pay attention like we did in the good old
days. Crap. There were just as many shake-n-bakers back in the good old
days, FUBARing everything in sight. The 10% / 80% / 10% spread seems to
be holding, if you ask me.

I always liked Lisp as a toy or academic language, or for the
individual programmer or boutique project but I think it's a language
meant for the dedicated programmer. I shudder at the thought of a big
corporate shop filled with Lisp coders...

If you like Lisp you might
want to get a copy of Scheme, too, as J.Ja suggests I believe I have
source for an old version of Lisp and Scheme, if you're curious - or at
least the BNF that you could LEX/YACC into something workable...

As I mentioned in my last post, I was drawn to J.Ja's blog entry because it resonates with a
my own parallel quest, and perhaps I've led the subject too far away
from his original intent to be a useful contributor here. But Justin
has provoked this sort of resopnse from me before, in the "Could AI
ever Happen" discussion he mentioned, where the two of us, along with
several others, managed to carry a fairly simple question into some
very deep waters.

So maybe it's a personality thing... 

In any case, it's been a pleasure reading everyone's thoughts.

by mark miller

To staticonthewire:

I got a good laugh out of your description of some typical programming teams you've dealt with. Wow. A programmer who wrote his function calls in koans and was building a sculpture out of dead cockroaches from under his desk! What an image! LOL!!!! :D I assume you said some of that in gest. Somehow, as I read that I felt like I could relate a little bit, like I was the guy who was doing that at one point in my life. I have since been reformed :). When I got out of college I was a bit full of myself in terms of technique. I remember when I got into one of my first jobs, working on a script interpreter written in C, I took one look at the code and said to myself "Oh this will never do." The program had it's bad qualities (there was a lot of cutting and pasting of code that went into it). It worked quite well for what it did. It was difficult to modify, however. Overall I wouldn't say the program was terrible. I eventually convinced my boss to let me refactor the code (I use the term loosely). Before doing this I had read a book called "Code Complete", and I took a couple of its suggestions to heart: always consider the "else" case in an "if" condition, and always put the most common expected action first in an "if-else" statement (like "if (<commonly expected condition>) {<commonly expected action>} else {<rare, unexpected action/error condition>}).

This led me to write if-else's like this sometimes:

if (<commonly expected condition>) {} else {<error action>}

It was my way of testing for an exception condition (such a situation would be an exception in C++, for example), in a case where if the condition was true, everything was fine, so do nothing. I used this form often. Eventually my boss ragged on me for writing code this way though.

As I progressed through the code I fell into the "mission creep" trap. I found more and more things wrong with it. Instead of just improving it a little, like consolidating the cut-and-paste code into functions, I insisted on rewriting the parser into lex/yacc code. Originally it used gets() and a tokenizer function for parsing. Further, I was dying for a way to make the pointers more manageable. There were tons of them, very complicated to deal with. Every time I made a change to the program, it would crash the computer because of some errant null pointer (it was running under straight MS-DOS). Instead of taking me a couple weeks like I thought, I ended up spending something like a couple months on it. Once I was done I was so proud of myself. IMO the code was a thing of beauty to behold. In order to do this, however, I had to take out some language features. Best I could tell, yacc couldn't deal with a couple of the language structures that used to be there, so I convinced my boss to let me take them out.

There were a couple problems though. The new program required so much memory that I ended up compiling it using a DOS-extender. This meant that normal debuggers (like Borland C++ for DOS) would not work. I ended up using some other tool that could understand the DOS-extended code, but it was more difficult to use. The other problem came when our salesperson wanted me to create a software package, which included my program, which was a report generator (which included the script interpreter) for a demo he was going to do. It turned out he needed some of those language features I thought I could take out. So I ended up giving him a version that was several months old, from a time before I did all of my meticulous work. What I realized then and there was that all I had done was satisfy myself. My thing of beauty was of no use to some of the people who actually needed to use it. That was a huge lesson for me. A few months later we ended up dropping the entire thing. We had one main customer we were developing this highly customized system for, of which the report generator I had been working on was a part, and they ultimately came to the conclusion that it didn't serve them. So the report generator was dropped entirely. We ended up going with a completely different solution based on de facto standards: Windows 3.11 and a relational database. The reason we needed the in-house-created report generator at all is the company was trying to market a custom designed, data-driven application authoring system, which used a non-relational database. Anyway, the main customer, and subsequent customers, really liked the Windows 3.11 solution. So the company went with that. All the changes I had worked on for the script interpreter were for naught. No one ended up using it. It wasn't entirely my fault. Part of it, as I would later find out, was the fault of management, who despite the protestations of the senior engineer in charge, insisted on this highly custom system being developed in the first place. It showed me that I had missed the forest for the trees, in my part of it. I don't think I could've done much better at the time, given my immaturity, and that I had difficulty understanding what the full product was until I had been working there for about a year. I assumed the project was very important and would get used.

Anyway, I wanted to address something you said earlier, that you felt isolated and have had difficulty communicating your passion for programming to people who don't seem to get it. I don't have a lot of answers for you in solving that problem. It kind of sounds to me like when you've been teaching students, you're dealing with adults. Perhaps you might want to start with kids. Get 'em while they're young, in other words. When I was in high school, I had the opportunity to teach kids programming, in BASIC, in elementary school. What I found was there is a certain age when they are "ready" for the material. I didn't do it for very long, but I found that the "magic" age when they can start grasping programming concepts easily is 10-12 years old. I also had the opportunity to work with younger kids, and they had difficulty with the concept. I can say from my own experience, I started learning programming when I was about 11 or 12.

At the younger ages, they're still interested in fun things, applying their creativity to what they're doing. I would think you would get an opportunity to nurture that in the realm of programming, to get them to use their creativity, and have those AH-HAH!! moments, that sense of victory from having conquered a hard problem and to see the fruits of their labor play out onscreen just as they had imagined it. I've seen teenagers in programming courses who didn't really get the excitement. They tended to drop out of the class though.

I would think working with older folks (adults), that they have more practical concerns that dominate their thinking: getting to the goal (getting the project done), and making enough money to support their families and their standard of living. To them, for the most part, having those AH-HAH!! moments probably isn't that valuable. Just a suggestion.

by justin james

Last week, I read the first chapter of Information Dashboard Design: The Effective Visual Communication of Data (ISBN: 0-596-10016-7) by Stephen Few, courtesy of the publisher, and available as a free download on TechRepublic. I liked what I read, and purchased a copy of the book. I finished reading it today, and wanted to share a bit about it.

I enjoyed reading this book. I have studied usability theory for many years (primarily Jakob Nielsen, but other authors as well) and did not find anything in this book to contradict what I already knew. I found the information in this book to be very useful in and of itself. Even better, the information in this book is extremely applicable to other less-specific forms of communication, such as Web sites in general, print, and so on. The author does an excellent job explaining the best uses of different types of graphs, data display, how to separate different groups of information on the screen, on so on. The author also (wisely) completely sidesteps any mention of any particular software packages. Because of this, this book will remain pertinent for a very long time. There are many excellent examples of good data presentation as well as bad data presentation.

The book itself was rather lightweight. Significant portions of each page were whitespace and the book was printed in a rather large typeface. The book itself claims 223 pages, but the actual content was more like 200 pages. Furthermore, much of page space was taken up by illustrations (reasonable, since the book is about visual design). There were also many "filler" pages throughout. Overall, I definitely got the impression that the book had a lot of "puff" to it to help justify its price tag. I read the book in less than two working days, merely by reading while my Excel reports were running. I think it was well under two hours to finish the book.

This leads to my biggest problem with the book, which was that it was extremely basic. The examples in the book of bad design show that either the vast majority of the people writing interfaces are clueless, or that systems with poor usability sell better than those with good usability. Overall, there was very little new to me in this book. But that is me, and the proliferation of unusable systems shows that the industry could use an easy to read, basic guide on data presentation. If you are new to the field of data presentation, GUI design, or Web design, or think that a basic text on how to show data effectively would be helpful, this is the book for you. If you have experience and knowledge in usability already, you will probably find this book to be a little bit too simplistic and general for your needs.

J.Ja

by g...

I guess there allways will be people to argue but why would Eclipse and Netbeans really have to cooperate for Java to loose or not. It is Java itself that has to make things happen. As it was rightfully said here, if there's only one interpreter, there would be nearly no problems at all. If they want to, they can create some but it would be much easier to cooperate.

 As for the .Net argument... I'm not sure it will "win" against Java in a near future (5 - 10 years) Because it is hell to make the most simple program runs on another platform and we have time before it happens.

For the differences between Eclipse and Netbeans. I think everyone will have to agree that they're not the same. Eclipse has much more in it. When you download the platform, it comes with PDE (plugin development environment) and JDT (Java development tools) and there are lots of thousands of plugins made for eclipse.
I'm not aware of anything like that with NetBeans. NetBeans is "cleaner". No doubt. And that's probably because it is more specific not targeting so widely.

For my part I LOVE Eclipse because you can find a plugin for anything you want and it generally takes 10 seconds to install it. I program in python, C, Java and there are Eclipse plugin for all of them also for tools like Antlr or Swing or anything you want. I allways found a plugin to help me in my work. And that's probably the reason NetBean is better if it's just Java you're up to.

To conclude I would recommand NetBeans if yoou will program Java but Eclipse if you're doing different things and you  like to do it in the same environment.

by justin james

This is the first in a two part series.

Developers are often cocooned in a shell, isolated from much of the greater operations of their employer. All too often, IT is treated as a black box, frequently with GIGO (garbage in, garbage out) results. Project specifications are often driven by people and departments with little understanding of technical matters, and the people implementing the specifications have little understanding of the why of the project. When the why is "create or expand an Internet revenue stream," the result can be disastrous.

Many Web sites (especially online stores) are, and should be driven and run by the Marketing or Sales departments. They are experts at selling the product. They know the market, the competition, and more. What they do not know is Web development, and on occasion they do not understand Web design either. This creates bad project specifications, where the how is dictated in a demanding yet vague way, and the why is completely ignored. I have been given project specifications similar to these way too often:

* Look similar to site XYZ, but with our logo and colors
* Have a drop down menu system like site ABC
* We want to collect the following information from visitors at every opportunity: [insert list of the most personal and intimate details of the visitors' life here]
* Spiffy Flash intro
* A lengthy "About Us" page that gives the users plenty of pictures of our CEO and facility
* A shopping cart system, preferably one that does everything that a live salesperson would do, with a strange interface and bizarre options for the user
* "Community building" features, such as a forum, product ratings, instant messaging between registered users, wikis, blogs, RSS aggregation, and a million other buzzwords of the week
* "Viral marketing" systems like affiliate programs

Sound familiar? That pretty much sums up nearly every Web store project specification that has been dictated to me. It is pretty interesting how most of the items on the list are, at best, only loosely related to the why of the project: to sell products! Here is what a why oriented project specification might look like for a Web store:

* Must appeal visually to our target audience: [insert target market demographics here]
* Site must be extremely usable by our target audience, and very usable by non-target audience members
* Site must present the most useful and interesting product information up front, but allow visitors to get as much product detail as they need, to simultaneously encourages sales, as well as minimize the need for customers to contact us before making a purchase
* Site must be consistent with our corporate "look and feel" in a manner that does not compromise usability
* Site must be a secure as possible
* Site should foster a trust relationship between our company and the customers, particularly new customers
* Site must have search engine optimization baked in from Day 1

See the difference? Interestingly enough, not a single item on the why oriented project specification precludes a single thing on the how oriented list; however, many of the items on the how oriented list can preclude items on the why oriented list, depending upon a number of non-technical factors. For example, if the target audience is "well-to-do, young graphics designers using Macintoshes who are at work," a site with a lot of Flash pieces that often emphasizes form over function is not likely to hurt sales, and may even boost them a bit. If the target audience is "retired people on limited incomes," chances are that anything with a font size smaller than twelve points, or that requires "the latest and greatest" in plugins, or a good deal of technical savvy will not be able to sell much product at all.

In other words, we have a classic case of missing the forest for the trees. The trees are technological and aesthetic hows. The forest is the business why of the project in the first place. Even worse, it is not enough that when the development focuses upon technology that the business reasons for the project are forgotten. In all too many cases, the technology actively prevents the business reasons from ever being fulfilled. In the next article in this series, I will provide some examples of how focusing upon the technological aspect of Web development as opposed to the marketing side of a Web project can hurt more than help.

J.Ja

by dawgit

Sounds famillular, so far.  Now I'm waiting for part II.

I know you might not mean it so, but this is a Humorus way to look at it (ok, it's more 'Sad-but-true')

by justin james

dawgit -

I do aim for a dark humor sometimes, happy that you were able to get a laugh out of it. :) These really are those "shake your head, it's sad but true" types of scenarios. The last freelance Web store I worked on, the initial project specs sounded a lot like "installed some typical software package, make one or two small changes to the base code, edit the templates, and get paid." I have invested well over 200 hours of my time into the project, and it still is not finished, mainly because the customer wanted some bizarre "system builder." In a nutshell, they wanted something along the lines of what Dell does with their website, but even more comprehensive.

I keep wishing for the customer who has never seen a computer before, and just says, "here is what I do by hand on paper, please find a way to have the computer make this more efficient."

J.Ja

by hchelette9

Absolutely 100% on the mark - and not limited to web projects, either! Unfortunately, I'm afraid you're "preaching to the choir". Those of us likely to read this are NOT the ones perpetrating the problem. Even the few of the marketing types that might be chance to read TechRepublic are likely to be in denial and refuse to consider that their specs could be difficult or problematic. Will there be an article on How to get your Marketing Department to get a clue?

by csturman

If you really want to have fun with marketing types, start inventing buzz words and see who picks them up.

by snoopdoug

When the marketing/sales droids pester me, my first question is "What are you trying to do or not do?". Unfortunately most of us tech types are not good at handling the fragile psyche of others. We tend to say things like "That's stupid" or "That will never work", instantly converting an opportunity to work compatibly with a colleague into a battle of wills and egos.

Stop yourself from your first, blunt response. Let your ego go. You might learn something.

Try putting the droid at ease with off-putting responses like "I'm kinda out of my element in this look-and-feel thing. Could you walk me through what we are trying to accomplish by putting a Flash intro on the home page?". You never know, they might even have a good idea.

Also, don't forget to get them to prioritize their wishes. Is the Flash intro more important than the shopping cart? If it's crunch time, can I push the Flash intro to the next release?

Ask them for their marketing/sales analysis. Who is the customer? What are the demographics? How many hits do we expect? Make sure they have done their due diligence before committing to the work. If they are flying from the seat of their pants, you are building something that may not solve anyone's issues.

And most importantly, do not let them bully you into a killer schedule. Roll out the updates in the order of importance. In my experience, they are more interested in the look-and-feel than the technology behind the application. I spent three weeks dummying up an app for a demo. All they could talk about was the crappy interface. Find a way to abstract the look-and-feel (ooh, I know, XML config file! The buzzOmeter will ring off the hook) and you will be way ahead.


doug in Seattle

by hamish_nz

Thanks, that is some useful information, although I don't agree that Flash necessary equals bad accessability. A well designed Flash site will work on practically any platform, whereas other formats can be highly browser/security setting dependant.

I would hazard to say that you have it the wrong way round - a tech-savy user who knows his keyboard shortcuts might find the Flash site frustrating, whereas the grandparents would probably appreciate the point and click nature of Flash applications.

That is some excellent advice though - I think that Marketing and IT people think in similar ways sometimes, we can be much more interested in the how, so it is good to remind everyone where the focus should be.

by justin james

This is the second in a two part series.

In my previous blog (Web Development vs. Web Marketing), I discussed some of the ways project specifications can interfere with the business reasons for the project. Today, I will take a look at just how technical implementations, while being technical correct or acceptable, can hinder and even hurt a Web site's ability to fulfill its purpose. To illustrate, I am going to use the sample "why oriented project specification" that I laid out in the previous article. To repeat it:

* Must appeal visually to our target audience: [insert target market demographics here]
* Site must be extremely usable by our target audience, and very usable by non-target audience members
* Site must present the most useful and interesting product information up front, but allow visitors to get as much product detail as they need, to simultaneously encourages sales, as well as minimize the need for customers to contact us before making a purchase
* Site must be consistent with our corporate "look and feel" in a manner that does not compromise usability
* Site must be a secure as possible
* Site should foster a trust relationship between our company and the customers, particularly new customers
* Site must have search engine optimization baked in from Day 1

This is actually the basic skeleton for any good project specification. Note how it focuses upon why the Web site is being created in the first place: to sell products as efficiently as possible! A site that looks great and have cool widgets all over the place, but is totally unusable and baffles search engines will not make much money at all.

Must appeal visually to our target audience

I would have hoped that garish websites, graphics heavy websites, and so forth would have died with the late 90's. Sadly, this did not happen. Thanks to the broadband boom, Web designers and developers now feel free to load a Web site with 200KB worth of graphics. I guess these developers all live in major cities. Most parts of the state I live in (South Carolina) are still on dialup. Too much of the population either has no cable, or is so sparsely populated that the phone company is not going to put Cos for DSL all over the place. At best, these users are on satellite, which I have found to be unreliable and slow from my days of network management. South Carolina is not an isolated exception. Do you think that a farmer in the Midwest or someone in the Dakotas is likely to have a fast Internet connection? Even if your Web site is aimed at business users, you should keep in mind that many companies frequently under provision their offices. Most users simply do not (or should not) need to spend much time outside of the LAN, and what bandwidth there is, is frequently filled up with inter-office communications. In other words, when you have 20 users on a single T1, the bandwidth available to each user is not so much. Web sites should still be extremely lightweight, end of story.

Site must be extremely usable by our target audience, and very usable by non-target audience members

This is another pain point, on many levels. Those nifty menus that you designed may work for you, but they probably confuse a user. If they drop down automatically on a mouse hover, that is different from how desktop applications do things, and is confusing. If they need to be activated by a mouse click, you have confused your user because a mouse click in a Web site is "supposed to" (in the user's mind) take them to a new page. Even worse, did you break the user's right-click functionality, such as the ability to open the link in a new tab or window? Will the top level menu item take the user someplace useful as well, or is it just an access method for the menu? Can a screen reader read the resulting menu, so that vision impaired users can use your site? Will my mother be able to figure out your menu system? Avoid those drop down menus, they are simply a crutch for Web designers and developers who do not know how to construct a useful, usable navigation system.

AJAX is another usability breaker. It is nearly impossible for vision impaired users who use screen readers to work with. Anything requiring drag/drop or right clicking (they are acceptable if they are not the only way of using the site) is a bad move too. In fact, anything that requires any type of input other than single clicking with the left mouse button is an utterly unable system. You do not want to require your users to experiment beyond the lowest common denominator of input (single left mouse click) to use your site.

Sites that look like desktop applications are another usability disaster. You are confusing your user. Even if the whole Web went to "desktop-esque" sites tomorrow, there is still the problem of everyone having a different idea of how to make their pseudo-rich clients look and function. If you want your users to give up and walk away from your Web site, try to make it look and act like a desktop application and not a Web site. When the user opens their Web browser, they expect Web sites, not applications. That means standard form widgets and links only. That means that text or graphics that look like links should function like links, including retaining the browser's right-click functionality. That means that saving the page as an HTML file should work, and the user's copy/paste functionality should not be impaired. It means a lot of things. Keep your Web page a Web page; if you want to add additional functionality, it should be marked as such so that the users knows that they are using an application. Microsoft made this mistake with the new MapPoint web site; the site is useless and unusable now.

Site must present the most useful and interesting product information up front, but allow visitors to get as much product detail as they need, to simultaneously encourages sales, as well as minimize the need for customers to contact us before making a purchase

This one should be obvious. Many Web sites fail on this one, not due to over engineering the site, but due to under engineering. Products that only have a small thumbnail image of the product, database schemas that do not allow detailed product information, or force the information display to be so universal that products with special features do not have those features highlighted, short descriptions that are just truncated versions of the long description; these are all ways that an under engineered Web site can fail to present the right information to visitors at the right time.

Site must be consistent with our corporate "look and feel" in a manner that does not compromise usability

Frequently, Web sites try to incorporate too much of the companies non-Web branding into the site in a way which kills usability. For example, putting a Flash intro (or any kind of intro page) is a disaster. It is also a waste of time. Chances are, your users are coming from a search engine and will bypass that page anyways. What works for print and what works on screen are two entirely different things, right down to the choice of fonts. For example, Arial is more readable than Verdana in print; but Verdana is more readable than Arial on the screen. Times New Roman is even worse on the screen, while still being a great choice in print. Splitting the main text into columns is another items that works in print and fails on the screen. Sidebars, light watermark graphics under the text, "splash graphics" all over the place; these are all things that work great in print but fail on the screen. Similarly, the way your customer presents itself in television ads is not how you should be designing your Web site. TV ads are meant to get the audience's attention before they duck into the kitchen or bathroom (right down to having a higher sound volume, so they can be heard in another room). Your Web site does not need to be doing this; if it is on their screen, it does not need to gain their attention. They have already chosen to view it. And for the love of all that is good, do not force your users to watch your TV ads on the Web site.

Site must be a secure as possible

Every new feature you add to a site, if it involves sending data to the server, is a potential security hole. Too many "perpetual beta" pieces of software have security bugs. Even worse, updating third-party Web applications is usually an absolutely nightmare. In a nutshell, go ahead and use some "super cool alpha release" piece of code from SourceForge. But be prepared to sit on top of that application, checking their bug tracker, looking for updates, performing security audits, and so on. Constantly. It will be like 1997, all over again! Woo hoo! Go ahead, add an RSS aggregator to your Web site; just be prepared to take the blame when malicious code is dumped to your users (or your servers) via the feed. Use that third party survey system (which no one fills out anyways) if you want; but when a poor use of sprintf() lets some malicious user take over your server, accept the blame. Install some goofy search system, I will not be offended. But I will not have any sympathy if you chose a product that kindly offers your database information to users when it bombs out, and has a SQL injection hole in it to boot. To repeat myself, every new feature you add to a site, if it involves sending data to the server, is a potential security hole.

Security and usability also do not play nicely with each other. It can be a fine balancing act. I am indeed sympathetic to it. But when make your users have a strong password, but do not help them make it (the MSDN site has an excellent system for this, by the way; it has a little "security meter" that goes from red to green in real time, to indicate that you are meeting the requirements), then they are quite likely to give up and go to another site to make their purchase.

Even things like user comments or reviews can kill a website. All it takes is to have a poor filtering mechanism that allows someone to put in some CSS code to make your site look bad, or to be spammed, and make the system worse than useless. Captchas are not the solution either; there are plenty of tools out there to break them. If your site involves trading money for a product or service, you can be sure that someone will try to rip you off.

Site should foster a trust relationship between our company and the customers, particularly new customers

This one is pretty simple. Avoid sleazy things (like popup ads, banner ads all over the place, the awful "Ads by Gooooooogle", etc.), and your users will get the impression that you are a professional company and will be more likely to trust you. A site that spews out JavaScript errors all over the place does not foster trust. My first thought when I encounter a site with JavaScript errors is, "Wow, their programmers are incompetent. Will it be safe for me to let them have my credit card number?" Use your own ID systems, do not make the user give you their Social Security number or driver's license number unless required to do so by law. In fact, do not even ask for it. And if you are required to do so, make sure that you make that clear to the user. And when you ask for it, let the user know how it will be used, and how that data will be protected. Do not store your user's credit card numbers without asking them first (indeed, this is the law). And so on.

Site must have search engine optimization baked in from Day 1

This one is the ultimate killer. A five percent increase in traffic from organic search results is a five percent increase in sales. A site in the Top 10 of the major search engines will outsell a site on page ten of results by a disgusting amount. To put it bluntly, anything other than pure, static, standard compliant HTML is going to hurt your rankings in the search engine. Sure, your super nifty Flash application may look awesome. But how is the Marketing Director going to react when he finds out that if he wants top search engine placement, he will need to spend thousands of dollars a month on pay-per-click ads? Even worse, pay-per-click ads are not nearly as effective as organic search results; an organic search result listing is about twenty times more likely to be clicked, and around 14% of all pay-per-click page views are click fraud. Do the math. Is taking that kind of hit to your search engine ranking worth that kind of loss of search traffic? Are you hoping to make up for it by having other sites link to yours? If so, ask yourself this: how are those other sites going to find out about you in the first place, if you are not well positioned in the search engines? There is a reason why Google, Yahoo, MSN, and other sites earn billions of dollars in revenue from their ad systems. Search engines are that important.

Unless you are a site like Amazon or eBay, where everyone who is looking for what you sell is going to go to your site first, you simply cannot let technological wizardry stand in the way of your search engine rankings. A site that gets zero visitors makes no money, it is a simple equation.

What does this mean for the Web designer? It means that anything that is dynamically generated should come out as static HTML code. It means that your URLs need to be search engine friendly (which is also bookmark and email friendly too, another usability item). It means using CSS responsibly, to separate presentation from content. It means properly marking up your code, particularly with the header tags, strong and emphasis, etc. so that the search engines know what each page is about. It means providing ALT tags on your images (good for screen readers, too). As a shortcut, try out your site in Lynx or use a screen reader on it. If the site works great in those environments, the search engines will love it.

It is a great thing that as your site's usability improves, so does its search engine rankings. Search engine spiders are essential dumb users with technologically backwards browsers and a dozen different physical handicaps. They cannot right click, they cannot run JavaScript, they cannot drag/drop, they cannot use Flash, they cannot use AJAX, they cannot follow JavaScript links, and so on. To have any of your site accessible solely through any of these methods not only hurts your usability, but it kills your search engine rankings.

I designed a site about eight years ago that has been in Google's Top 10 for its keywords (very generic terms). It is pure static HTML. We recently redesigned the site, the customer told me one thing: "whatever you do, make sure that it does not hurt the Google rankings. I don't care what kind of features we might not use, just use the same techniques you used last time, and I am happy." I would say that this is a pretty strong endorsement of my techniques. At the end of the day, that customer is spending pennies on pay-per-click advertising (he likes to appear twice on the search engines!), while his competitors are spending a fortune. Users tell him that they like his site because it is to the point and easy to use. He likes the site because updates are easy to make. All of these benefits came from eschewing fancy programming for plain, static, boring HTML. And it was easier too!

So, before you write a single line of code on your next Web site project, ask yourself: does this code address why I am working on this project? Or am I just following the current trend, or having how I do this be dictated to me with no business purpose behind it? Otherwise you may find out that you met all of the project specifications, and have an extremely unhappy customer as a result. Remember, you are the expert on these things, not the customer. They may have some idea of what they want, but at the end of the day, you are supposed to know how to build a Web site. To let a customer make these kinds of decisions without you letting them know what the ramifications of those decisions is simply irresponsible, and your customer will appreciate you more if you work with them to make the best Web site for their business.

J.Ja

by tavis

Truth.

LOL. Flash splash screens, magpie collecting from other sites, ignorance of accessibility and web standards, tolerance of JavaScript errors, simple search engine optimization? your article really rings true.

Of course, when I said much of what you said to our Marketing department, I got taken off the website and they brought in external designers. C'est la vie!

by wmarkhall

Hello, and thank you for the opportunity to reply to your topic.I won't waste your time with wordy circular opinion or grist for an echo chamber; however, I completed a degree in IST six years ago (in my late 30s), and in that experience I took home one salient point re programming: those proficient in English were, in the opinion of every professor of programming I had occasion to ask, the better programmers by a significant margin. Programmers lacking English skill, among other things, tended to exhibit more slovenliness in their code, leading to less than eloquent or interesting solutions. This sampling, of course, implies college level math of at least a passing grade.There are myriad opinions on this topic, and the mere observation by a handful of programming professors that English skill equated to programming skill is by no means scientific --  it is surely anecdotal. Nonetheless, I found this to be true in most -- but not all -- cases myself when examining the final projects in each of the classes I attended. The students that could write well could code interesting solutions as well as create compelling programs.  I've since read a few essays that espouse the same viewpoint as expressed by my professors, as I'm sure a quick Google will reveal for those interested.Thank you again for a thought provoking topic on which to opine.Peace,-WMH

by grantwparks

"Better code" can be written regardless of the language or platform; your point is a red herring.  I am more concerned with "producing better product".  I also prefer to think in terms not of "open source", but open technologies, or more precisely, W3C technologies.  I just left a document authoring project that was being implemented using MS Word's Smart Document framework, and I couldn't have been more disgusted.  Using markup, stylesheets and browser, a much cleaner, smaller, user-friendly and easily deployable solution could have been created six times over in the time it took us to create a kludgy, monolithic application that the users were not very pleased with.  And it frustrated me to death that every Web article I ran into while looking for help praised Smart Document as some wonderful advance in user/document/form capability.  The user interface was clearly taking ten steps backwards from what Web users have become accustomed to.  The cost to the company to write and deploy the application was much higher.  It was a lose-lose situation.The modular, unobtrusive nature of W3C technologies allows them to be smoothly combined to produce better light-weight, fast, modular solutions.

by rayarosh

You're right, if my business model  was based entirely on using Google free maps API that would be foolish, but you need to ask yourself what's the alternative.  If you have a localized mapping system ok maybe you could buy the maps and the satellite images and host them youself at an extremely high bandwidth cost, not counting the high cost typically associated with any sort of quality up to date digital map.

Now let's say you want some sort of nationwide mapping system, the server space, cost of maps, and bandwidth that would be required would be unbelievable, all for a yet undeveloped application that may not even gain traction with consumers.

What Google Map Mashups allow you to do is beta test you app with real maps on real servers and see what happens.  You can see if people like your mashup that shows you bars within 1 mile of hospitals, or houses outside police coverage areas.

If it works then you can build your own infrastructure, or since Google really is just in it for the money, work out some kind of licensing or revenue sharing idea.

 

by justin james

I am going to say something that will not surprise my regular readers: I am not a fan of rapid application development, agile programming techniques, "test in production," perpetual betas, the continuous patch cycle, and other current programming trends. I am not the only one, either. I think that this paradigm of programming is incredibly broken. I am of the opinion that patches should be rare, not because the developer should not fix bugs, but because bugs should be rare. I wholeheartedly support only a few minor version releases, and long cycles between major releases.

I also am fully aware that "this is not how things are done."

The current business environment is all about "now, now, NOW!" As a result, we have become accustomed to getting software that is slow, buggy, and insecure from Day 1, and (hopefully) slowly improves through its lifetime. Our best case scenario is software that is only mildly broken, but usable, and it eventually morphs into what it should be. The worst case scenario is a system that as it evolves and new features are added and existing features are fixed, backwards compatibility is damaged, security holes allow sensitive data to be stolen or maliciously modified, and users become frustrated and angry.

Right now, the development cycle is predicated on the first mover principle: get a product, regardless of quality, out the door, dazzle users with the feature set, and hope they stick around long enough for the problems to be fixed. Sadly, what ends up happening is that another competitor invariably pops up, so instead of fixing the existing bugs, new features are cranked out in an effort to keep the existing user base and maintain growth. The new features are buggy too, the old features become buried, and the code gets crustier and kludgier until it is a warm pile of compost. Eventually, the only way to fix the problems is a complete tear down and rebuild.

At the end of the day, I have a responsibility to my customers. That responsibility is to solve the why of their business process, whether it is selling products online, properly determining their sales, marking hazardous shipments in accordance to federal law, or whatever. The why is not "join the latest technical revolution" or "support a favorite software vendor" or "make decisions based upon my emotional reactions to certain things." Usability, reliability and security must always be primary in my development process. Unusable software does not get used, or is used incorrectly, which means that the why is not being accomplished. Unreliable software loses data, wastes the users' time, and often makes the users afraid to do anything (we have all used an application where we knew that certain operations would crash it out, so we ignored those features). Insecure software can destroy my user's business, and the resulting lawsuits can put my employers out of business as well.

Microsoft did exactly all of this for over twenty years: they put the development of new features ahead of perfecting existing features and producing reliable, secure code. It actually worked for them too. They achieved market domination. The end result though, was hundreds of millions of computers having severe vulnerabilities. Many of the features that helped Microsoft achieve business success (Office macros, IIS/ASP, ActiveX, and more) had holes in them so big you could drive a Mack truck through them. Microsoft has been the butt of endless jokes as a result. In response, Microsoft ceased development on a large numbers of new features to concentrate on fixing code, and has had to completely reengineer their development process to put reliability and security at the forefront of their efforts.

What I find most interesting, is that this is exactly the path every other developer seems to be going down now! The "Web 2.0" crowd especially, but OSS is headed towards this direction as well. One project I keep an eye on has not released a production release in years, that I am aware of, but keeps cranking out "alpha" and "beta" releases. There never seems to be any actual final, production release of any version, but they run both minor and major versions through "beta" constantly. Google seems to have 75% of its products in "beta" at any given time, some of them on the market for years. What I hear in many comments and discussions is that "we need to make the best of what we have today." No, we really do not. We need to write the best code possible today.

Here is an example of what I mean: today, I made hotel reservations with a Hyatt hotel on their Web site. I went back to change my reservation, because I had made a minor mistake in the days. Their reservation lookup form allows me to enter the credit card number to look up my information if I do not have my credit card handy. Except there is one huge flaw: it does not use HTTPS! So not only is my credit card number being sent in plain text (along with my first and last name), but it is going to be stored in my browser's auto-fill system in plain text! This is a failure on every level. All because someone did not think about what they were doing when they wrote code and no one gave their code a second review. All in the name of rolling out a feature to help the user. I am sorry, but I would have preferred to have to call customer support or find my confirmation number than to give out my credit card number over a plain text connection and have it stored in my browser.

I find this very ironic. Just as Microsoft works to tighten down the screws as hard as they can, without breaking Windows' backwards compatibility (and other features which help make it unreliable and insecure), Java starts growing its sandbox, developers begin to advocate putting out buggy releases and fixing them later, and the rest of the world in general transitions to releasing code quickly without proper review and testing.

George Ou has discovered that that tens of thousands of defaced web sites had something in common: most of them had a common hosting solution, and the hack appears to have occurred through sloppy ASP code. Worst of all, the suspected security hole was known since April, 2005. Let me repeat that for extra clarity. A bad programmer possibly wrote bad code that was known to be bad for about fourteen full months without being fixed, leading to a massive security breach and thousands of defaced Web sites. If I were that developer I would be writing my will right now, buying cans of baked beans by the crate and making plans to hide in the mountains for the next century. If I were the company that employed this programmer, I would be calling John Edwards and asking him to contact the spirit of Johnnie Cochran for legal advice. It is that serious. Talk about negligence of a criminal nature! This is why I am such a hard case about these things. Do you want to be the systems administrator who did not patch the managed code environment that was known to be buggy, allowing hackers to destroy your business? Do you want to be the CIO of a company that outsourced their development to a third party vendor with no internal review of the code, allowing a bug to linger for years that caused millions of dollars to be redirected to some bank in the Bahamas? Do you want to be the programmer who did a copy/paste on some code from some website that contained a buffer overrun exploit, giving hackers root on your servers?

Look at the why of some projects I have worked on: "selling products online, properly determining their sales, marking hazardous shipments in accordance to federal law." Imagine what happens if I write buggy code for any of these projects. Credit card numbers could be stolen. A federal investigation could be launched into the company's violation of SOX, or the incorrect payouts of millions of dollars in bonuses and other incentive compensation could occur. The company's transportation network could be shut down by the federal government while they audit the HAZMAT controls. The code I write must be bug free. The lives of real people and millions of dollars are on the line.

A short essay written by Professor Kurt Wiesenfeld entitled It Was a Rookie Error is something that I read during college, and I keep the ideas from this essay in mind whenever I write code. When programmers write bad code, people can die, companies can collapse, millions of dollars can disappear, or lives can be ruined. If this sounds overly dramatic, think again. Sure, you may only be working on a small personal Web site today. But if your small personal Web site gives root to a hacker, someone else's Web site that may be much more sensitive could be compromised. You may just be writing a "quick and dirty" script, but "quick and dirty" code tends to linger forever and have real systems built on top of it. Your small driver for an obscure device may end up in a system for air traffic control; if it crashes the OS, people die.

So the next time you think about releasing untested code, or code with known bugs for the sake of getting new feature in the face of users, think again. "Good enough" is never good enough in the real of real IT.

J.Ja