November 29, 2007
(You can find the full list here)
Some people feel compelled to comment. Some feel that they have humorous observations to add. Others simply enjoy the self-referential nature of blog posts about commenting on blog posts.  Others enjoy the meta-story of how they comment on blog posts about commenting on blog posts. Sometimes, when the comments take a life of their own, the original blog post becomes irrelevant – it is only a host body to allow the comments to flourish.
Those that do not comment, and those that do, will have one thing in common.  What do you think that might be?
November 6, 2007
If you like APIs and mashups, you should check out ProgrammableWeb – it’s a directory/advice/analysis site for all things API-ish.
Most recently, they’ve been working on building a subsection for government APIs, which is something that I’m very keen on. They’ve done a terrific job of organizing and structuring the information there. Outstanding work!
October 22, 2007
Reg Braithwaite has a very strong case for being more open-minded in your programming research/learning.
Having said that, this is probably the difference between the Myers-Briggs INTP and INTJ subtypes. INTJs (which is very common amongst programmers) are prone to judging and rejecting information that they disagree with.  INTPs less so.
Having said that, I’ve certainly made this mistake on more than one occasion (and quite possibly blogged about it as well). Â But now that I’m thinking about it, I suspect I’ll make it less often.
October 21, 2007
It all started when I realized that my younger son was struggling with reading.
Not with the letters, or the words, really, but with his own expectations. He didn’t like making mistakes, and didn’t like that his older brother didn’t make many mistakes.
So he refused to read, because he wasn’t good at it. Catch 22
Pondering this for a while, I thought – maybe if he had something to read that was really interesting, it would motivate him.
And so I wrote Bookr – http://www.undefined.com/bookr – a Flex app that lets the reader choose which characters will be in the book, and makes it more “just for them”, which I hope gives them a reason to want to read it.
I started with Star Wars characters, and have since added characters from the Nightmare Before Christmas and Disney princesses.
So far, I’ve discovered two things:
1. It does seem to work – my son loves the stories, and was very interested in making up fun combinations.
2. Because you can play the same book with different characters, there’s a fair amount of reinforcement.
If you have younger children who are thinking about reading, feel free to give it a try. You can even write your own Bookr books, and I’ll include them in the library.
Tutorial here: http://www.undefined.com/ia/bookr/
Comments and feedback are welcome.
August 10, 2007
Now that everyone at work knows, I can tell my loyal readers (all 2 of you) that I have taken a new job, as the CTO of the Sunlight Foundation. It’s a non-profit, based in DC, that focuses on using technology and the Internet to spotlight waste, fraud, corruption and “questionable” behavior in Congress.
I start in September. Half of my family is nervously excited about the move, the other half is nervously anxious.
June 5, 2007
You can do this in Ruby, and there is some argument whether it is a good thing to be able to do (in terms of readability, comprehensibility). You can override an existing method w/your own  (I forget what the term is, right now, mainly because I never use it). Ruby on Rails takes full advantage of this.
Apparently, you can do the same thing in Flex, for the internal functions/capabilities of the MX Controls.
Void where prohibited, your mileage may vary, etc.
February 28, 2007
In case anyone else is wondering, I did find the problem with opening my saved Haskell file in WinHugs.
At the same time, apparently there are different dialects of Haskell, and it is difficult for a casual observer to tell.
Specifically:
- If I go to Haskell.org, click on Hugs, then Download, and the WinHugs, download it and install it.
- And I then go back to Haskell.org, and click on Haskell in 5 easy steps, I would expect that the provided examples would work. In fact, if I look at Haskell in 5 easy steps, it gives absolutely no indication that the examples they are using will not work with Hugs. They even provide suggestions on how to download and install Hugs as part of that tutorial.
This is not a slam on Haskell, Hugs, or any person out there who writes, enjoys or uses Haskell! I am not criticizing anyones abilities, intelligence or judgment.  I am simply pointing out that for a casual amateur, this is not the most friendly of introductions, and I’m sure that a lot of people give up at this point, rarely to return.
As for me, thanks to Don and Neil’s help, I can actually try experimenting with Haskell now and see what I can learn.
Thanks, guys!
February 26, 2007
I thought I would spend some time this morning trying to learn Haskell. I happen to have downloaded a copy of WinHugs, and it seems to be functioning properly.
Alas, every function definition example I try to use blows up on me.
From: Beginning HaskellÂ
Hugs> myNum :: Int
ERROR – Undefined variable “myNum”
Hugs> square :: Int -> Int
ERROR – Undefined variable “square”
Hugs> square n = n*n
ERROR – Syntax error in input (unexpected `=’)
Hmm, maybe the syntax is different? Looking at the WinHugs documentation, it says it is Haskell 98 compliant, except in some strange ways. Well, there’s always “Haskell in 5 steps”
Hugs> let fac n = if n == 0 then 1 else n * fac (n-1)
ERROR – Syntax error in expression (unexpected end of input)
Hugs> fac n = if n == 0 then 1 else n * fac (n-1)
ERROR – Syntax error in input (unexpected `=’)
Hmmm. Looking further at the Haskell in 5 steps, it seems like maybe I have to write the factorial program seperately, and load it into WinHugs? So I create fac.hs, and put it in:
C:\dev\haskell
C:
My Documents
C:\Program Files\WinHugs\
Can it find it in any of those locations? No.  Even when I use the “Open” command from within WinHugs, it still can find fac.hs, even though I can clearly see it in my file explorer.
So I think that’s enough for one day.
February 12, 2007
Steve Yegge escalates the pompous programming punditry, telling us all exactly what you need to know to be one of the world’s best programmers. And I bet you can guess how well those skills intersect with the Venn diagram of Steve’s own skills.
Now, applying the lessons of this article to punditry, I need to mention three things that Steve can do better than I can before I criticize him:
- Steve clearly knows more about programming language internals and concepts than I do, even more than I knew when I wrote a few interpreters back in the day.
- Steve has some great advice on recruiting and phone screening.
- Steve works for Google, and I don’t
There’s no doubt that Steve knows his stuff. And I would feel, if I were to ask him about a programming question, that if he answered swiftly and decisively, he would probably be right.
Now, having said all that, I think he’s developing into a Clooney-esque perfect storm of self-satisfaction.  There’s no way he can make this claim legitimately.
a) He’s not omniscient. He can only apply his assertion to the domains that he has actually worked with in depth.
b) The definition of “best” is quite amorphous. The best GUI programmers, the best O/S programmers, the best real-time systems programmers, the best customer-domain experts probably do not find that lexical programming is the lump of coal that gets them over the hump into the “world’s greatest” class.
c) These claims of absoluteness are risible when they are made by politicians about law and government. They are typically risible when made by scientists, beyond some super-well-proven facts.  And about software… a field that is so young and raw that we still debate whether strong or weak typing is better? Hah!
Don’t get me wrong. Learning and knowing about programming language internals is valuable. It was extremely enlightening in a number of ways. But it is not, by any means the height of perfection that Steve would claim it to be, and it would be a disservice to the young people of the world if someone did not point out that Steve is conflating his opinion with absolute fact in an embarrassingly simplistic way that is unbecoming of his experience and intelligence.
February 7, 2007
- What is a useful application of the Y Combinator? I found a JavaScript example, which I understand syntactically, but I don’t see the point. Is it just the “flavor of the month” in geek one-uppedness?
- Finding an implementation of Haskell that runs on MacOS would appear to be an exercise in pain and IRC. Both of which I try to avoid.
- I love the way that everyone and their brother is telling us what the “characteristics of a great programmer” are. Two observations:
- The lists are always different in significant ways
- The writer always seems to feel that they themselves have most, if not all, of the characteristics of a great programmer.
So really these posts should all be read as “Here’s why I’m a great programmer.”
Update: Reg Braithwaite says “Learn the Y Combinator because it makes you a better programmer.” He then proceeds to write a blog post showing how he does exactly that. Which, while I respect Reg a lot, is yet another example of “Here’s why I’m a great programmer.” Reg’s approach, of course, is completely different from all the other posts on the same subject.
For the sake of argument, assume that every single of them is telling the truth, and that they are all, in fact, great programmers. What can you infer from that?
Update 2: In the comments, Reg insists he is not, in fact, a great programmer. I’m not sure I can agree with him on that
  He also insists that his approach will make one a better programmer, not a great programmer.
January 31, 2007
Bruce Eckel wrote an interesting article on the shortcomings in Java, and how much he likes Flex as a platform for future app development.
I think he’s exactly right – Flex apps will run in browsers on all of the major operating systems, and there’s no reason they can’t run on the desktop using a runtime of some sort. Â Other than 3d games and CAD rendering there are few applications that need direct access to the video card and the CPU.
If Flex does succeed here, it will represent the triumph of JavaScript over Java, Flash over HTML and Adobe over Sun. Â Microsoft may have a response with Atlas, but unless Atlas is fully cross-platform, I’m not sure it’s going to win.
January 17, 2007
One of the things that I’ve noticed about myself is that I discount the complexity of computers and software, relative to the complexity of engines and carpentry. Anyone can figure out how to set up windows shares, I think, butI feel stupid because I don’t know much about car engines.
Lately I’ve been trying to remind myself that most people, even those who know a lot about car engines, are not computer experts, and get confused and bewildered by the subtlety involved in connecting and communicating between machines, or in retrieving lost files, etc.  Let alone the tremendous complexity involved in setting up a real, working web application or software program.
December 21, 2006
(Hey, that would be a great name for a band!)
So last week, I was authorized to buy a MacBook Pro and try it out to see if we should issue them to the development staff. (One of the benefits of being the chief technical guy in a small company).  Since I’m the guinea pig, I decided to try out both Boot Camp and Parallels, as well as native Mac Os as well. Here, then, are my thoughts on each of them.
Mac OS
- Much faster setup and boot sequence
- I like the desktop widgets
- The “download something that turns into a disk on the desktop that I can’t get rid of until I reboot” is annoying, but not deal-breaking
- I use a dual monitor setup, which works perfectly, except that it is very frustrating to have to go all the way over to the left monitor to work the menu. Â This is one area where Windows seems better.
- My Firefox bookmarks, settings, etc, even the secure password thing transferred over from WinXP flawlessly. Kudos
- It is already loaded with the latest version of Java 1.5
- The Photobooth thing with the built-in camera provided a couple of hours of fun for the kids (and me too, I admit)
- Eclipse runs great. I haven’t tried the beta of flex Builder 2, but I expect it will work fine as well.
Boot Camp
- Easy to set up.
- Can’t get the touchpad to work properly. Had to download a third-party app to help with that.
- Performance is phenomenal
- This will mostly be used for games and such, although I did go ahead and install the full MS Office suite.
- Games look outstanding. I’m having crashing problems with Medieval II : Total War, but I suspect it’s the game, not the hardware.
Parallels
- Setup was easy enough. A little trickier than Bootcamp, but not significantly so
- I was able to mount the Bootcamp partition as a Network drive on the Parallels setup, so I can reuse my existing Office setup, and I’ll have one common place for documents across both Windows variants. It’s not working yet, but I have hopes that it will
Asthetics
- The MacBook Pro is slim, sleek and lovely. I’ve never had a better laptop in terms of look, performance or features.
December 5, 2006
I’ve been following the discussions on InfoQ about “The Lost Art of Separating Concerns†by Matt Baker. Matt compares and contrasts the relatively architecturally clean MVC model for UI work with the programmatic web services model. For example:
GET /stockQuote?ticker=AAPL
vs.
getRealTimeStockQuote(“AAPLâ€)
While I generally agree with Matt, I think that he doesn’t do a good job of describing what the benefits of the more generic approach would be. So I thought I would add my two cents. Note that I’m working on a web-services project right now, and I’m in the process of defining exactly this kind of interface, so I’m putting my money where my mouth is, as it were.
First, let’s look at the basic flow of the classic MVC model:

The caller makes a request, which is first processed by a generic handler, then a custom handler (or, potentially a series of custom handlers). The handlers call the business logic which works to populate the model. Finally the model is sent to the view, which , by way of the controller, sends visually meaningful information back to the Caller.
The result – the controller accepts the request, the business logic focuses on filling out the model, and the view is responsible for presenting it in a useful way to the customer. Note that there’s very little “typing†going on here – the caller’s request is essentially a hash map with some header information, the View’s response is a long String.
How do we adapt this approach for Web Services? Web Services don’t have a View, I hear you say. Well, that’s true, unless you change the word “View†into “Response Protocolâ€. In that case, I hope you would agree that the Web Service certainly has a way in which it should respond to a request.
So what?
Well, if you have multiple versions of your web service, you could invoke multiple “Response Protocols†– one for each version.
But with a traditional web service approach – getRealTimeStockQuote(“AAPLâ€) – it would be very frustrating to handle that.
No it wouldn’t. You just change getRealTimeStockQuote and add a new parameter, the version - getRealTimeStockQuote(“AAPLâ€, “1.0â€)
Hrrm. What if you want to create a variation that takes an array of stocks to receive quotes on?
Well, then you’d create a new method:
getRealTimeStockQuoteArray( [ “AAPLâ€, “GOOGâ€], “1.0â€);
Really? Because in the Web world, you’d still be able to do that with just one Action, by adding new parameters to the request. You might have to create a new view, but you certainly wouldn’t have to create another method. You might *want* to create a new Action, but you wouldn’t have to.
And that’s just a simple example. Think about a more complex web service, one that takes, say, a more complex object. And then the object changes – you add more information to it, you change and expand its methods. And you have to maintain all of the previous versions. Think about expressing an order for an MP3 player. A web service might evolve as follows over the years:
orderMp3Player(“Brandâ€, “Sizeâ€)
orderMp3Player2(“Brandâ€, “Sizeâ€, “Colorâ€)
orderMp3Player3(“Brandâ€, “Sizeâ€, “Colorâ€, “FM?â€)
orderMp3Player4(“Brandâ€, “Sizeâ€, “Colorâ€, “FM?â€, “Video?â€)
orderMp3Player5(“Brandâ€, “Sizeâ€, “Colorâ€, “FM?â€, “Video?â€, “Wireless?â€)
And this doesn’t even cover all the variations – Form factor (nano vs. mini), the video formats it supports, the battery length. And, most importantly, what about the response? The response message to orderMp3Player() might be significantly different from orderMp3Player5(). So now you’re looking at various versions, or a common handler with multiple output formats, all hand-coded.
How would you handle that (elegantly) in a traditional web service model? I ran into that problem a while back (only with a lot more moving parts), and the only thing I could come up with was to abandon a long parameter chain, and go with an HTTP Request-style hash map for my request, and another for my response.
orderMp3Player( { Map of Features })
This approach dramatically simplified the interface, at the expense of slightly more complex marshalling and unmarshalling of request and response elements at the client. But the interface wouldn’t have to change over time, and I could simplify all of my intermediate code. I could have a generalized receiver look at the parameters, delegate the request out to the appropriate business logic, and then, based on the version the client requested, format the response according to their needs. In essence:

Look familiar?
I was very happy with this approach. The concerns with interface maintenance and dealing with customer-specific mutations went away instantly.
But, interestingly enough, I was only tapping about 10% of the power of a weakly-typed API. Because I wasn’t taking advantage of all the other capabilities of the web-based model.
- Filters – because the request and response are generically formatted, you can configure various filters at run-time to intercept and manipulate the request and response.
- Run-time Handlers – beyond just the filters, because the interface is generic, you can actually replace one version of a web service handler with another without making any code changes.
Talk about separation of concerns! Now I can delegate almost everything that isn’t core business logic out to more-or-less generic filters. And I can dynamically swap in various implementations of my service handlers, without having to build that flexibility into the code. Consider:

Now, we’ve successfully delegated out a bunch of the “non-functional†work out to these handlers for orderMp3Player(). Now, if we want to add more features/capabilities to our MP3 Player ordering system, we’re golden.
Except that our boss just told us we’re expanding. In addition to MP3 Players, we’re going to also sell Farm Animals.
Urrg. Now I have to create orderFarmAnimal(), and set up this whole system again.
Well, unless I’m smart, and I switch everything over to the even more generic order() method. I’ll define a parameter in the hashmap to define what kind of “thing†I want to order, and then I’ll do all the rest of the business-specific work in the business logic. I can even “rewire†the MP3 orders, as such:

Oh. The boss called again. Now we have to not only handle orders for MP3 players and farm animals, we also have to store videos. (This boss is clearly trend focused).
Crud. The order() method doesn’t make sense in the context of video storage. We need a storeVideo() method.
But, frankly, accepting a video file and accepting an order, while different in business focus and other ways, are both variations on “putting†something on a server, no?
Well, why not go with a generic put() method? Or, if you prefer, post() – I don’t really see the need to treat them particularly differently.
So now we can define the put() operation. We’ll know from the data whether it is an order to process or a video to store. If we need to add more services, we can effectively reuse all of our logging infrastructure, our performance metrics, our authentication, etc. Given enough time, we’ll probably end up replicating Struts or something like it.
Pros and Cons of the Weakly-Typed approach
|
Pro
|
Con
|
|
Handles change quite elegantly
|
It is a harder API for the user to use, because it is so generic
|
|
Cleanly separates the various layers
|
Will be slightly more verbose
|
|
Allows for run-time changes in flow, structure and behavior, without explicit code
|
Because the server-side is so easy to change, it is easier for a non-coder to use and adapt it, making it harder to ensure job security with a complex and hard-to-use API
|
Of these cons, the harder API is the only major concern, in most contexts.
So how do I deal with that?
At the end of the day, this weakly-typed SOA is something of a domain-specific language – the “things you can do with my company’s services†language. Here’s how I’ve dealt with it so far:
1) Create a set of libraries to support the packaging and un-packaging of domain-specific objects into hash maps. Repeat for as many different languages as you can
2) Create tutorials, examples and test suites to help teach the user which parameters should be used when
3) Work hard on the error reporting feedback back to the user. Error message support in your parameter map should be one of the first things you do.
If you do these things, you’ll be miles ahead of almost everyone else on the user-friendliness side, and your API will stand the test of time.
November 23, 2006
To the tune of “Crazy” by Gnarls Barkley
I remember when, I remember, I remember when I lost my types
There was something so pleasant about that place
Even your constructors have a Proxy
In so much space…. mmmmmm..
And when you cast there,
without care,
Objects get out of touch
But it wasn’t because I didn’t code enough…
The compiler just knew too much
My objects are lazy….
My factories are lazy…
My typing is lazy…
Typically…
And then I learned how to write the best code in my life
But test twice… that’s my only advice….
Come on now, what do you, what do you, what do you, what do you think you are?
Ha ha ha, R.O.F.
You think you have type control?
Well, I prefer lazy….
I write my code lazy…
I initialize lazy…
Generally…
My interpreters have the smarts to duck typecast on a whim
And all I remember is thinking “I want to cast it like this.”
And ever since I was little, ever since I was little, I’ve loved to code
And it’s no coincidence I’ve found
That strict typings’ no fun.
But maybe I’m crazy….
Cause I prefer lazy…
I write my code lazy..
Usually…
Peace out!
November 7, 2006
With apologies to Monty Python
The Scene:
- Four strangely dressed men are sitting together at a vacation resort.
First Programmer
Now that’s a good cup of coffee.
Second Programmer
Nothing like a tall cup of Sumatra-Arabica blend, eh Dennis?
Third Programmer
You’re right there, Ken.
Fourth Programmer
Who’d have thought thirty years ago we’d all be sittin’ here drinking Sumatra-Arabica blend, eh?
First Programmer
In those days we were glad to have the price for a can of Jolt.
Fourth Programmer
Without ice or a glass.
Third Programmer
Or caffeine.
First Programmer
In a shaken up warm can.
Fourth Programmer
Oh, we didn’t have cans. We had to drink it out of rolled up greenbar.
Second Programmer
The best we could manage was to spill it on our shirts, and then suck at them.
Third Programmer
But you know, we were happy in those days, though we were programming in Assembly.
First Programmer
Because we were programming in Assembly! My old Boss used to say to me “Fortran won’t bring you happiness, Dennis.”
Fourth Programmer
Yeah, that’s true. I was happier then, and I had nothin’ but Emacs and a VT102.
Second Programmer
VT102!? You were lucky to have a VT102. I used to have to program on a VT52, in VI. And every other day the server would have to go through a scheduled reboot.
Third Programmer
Eh, you were lucky. I had to program in TECO
First Programmer
I used to dream of getting to program in TECO! It would have been so much better on my carpal tunnel syndrome (shakes his wrists and grimaces). I used to program in edlin on a teletype, and the server would crash three times a day without notice.
Fourth Programmer
Well, when I said Emacs, it was really only sed and some fancy shell scripts I wrote, but it was Emacs to me.
Second Programmer
I wasn’t allowed to use sed. My Boss said we couldn’t afford the license for it. I had to use echo.
Third Programmer
You were lucky to have echo! I used to have to punch holes in cards and stick em in a shoebox.
First Programmer
Cardboard shoebox?
Third Programmer
Yeah.
First Programmer
You were lucky. I had to carry around my punch cards in a grocery bag, and stick into a server that would give back to me all crumpled and torn. I worked 15 hours a day for a dollar an hour and when I got back to my apartment the roaches would skitter around the room singing to me.
Second Programmer
Luxury. I had to carry my cards in a wet napkin, stick ‘em in a machine that rebooted every 4 1/2 hours and eat every 15th card. At night I had to sleep in the computer lab, cause my Boss insisted that I was receiving school credit, and I had to support all the wannabe programmers all night long.
Third Programmer
Well, of course, I had it tough. I had to carry my cards around in a flaming barbecue pit, stick ‘em into a machine that would fail every 30 minutes and spent 10 minute rebooting. My boss made me do his laundry for free every week, and I had to sleep in the machine room.
Fourth Programmer
Right. I had to wire the computer by hand, carry around a bag of vacuum tubes to fix all the ones that failed. The heat from the computer would set my clothes on fire, and I had to spend 12 hours a day picking moths out of the wiring. My boss forced me to write all his papers and raise his children, and I lived underneath the floor of the machine room and spent the whole night listening to the drives go thumpety-thumpety-thumpety.
First Programmer
And you try to tell the young people of today that – and they won’t believe you!
November 1, 2006
I probably should have written this yesterday, but inspiration strikes at odd moments.
Announcing the new language – Lovecraft. It is inspired by the writings of the famous horror author HP Lovecraft, to maximize the thrill of programming.
Here’s the structure:
- The basic semantic structure is Ruby-like, but only in appearance. Its true nature is far more sinister.
- Lovecraft is, of course, interpreted. And, most importantly, in the past tense.
- You start with a number of threads, as many as you choose to allocate. Lovecraft is a highly concurrent language. The first one is the “Judge”, responsible for managing the rest. However, you can’t ever increase your threads – they will only decrease over time.
- Note that you don’t have to call it the Judge – you can also call it the Magistrate, the Investigator, the Governor, the Constable, the Examiner or the Sherrif – your choice.
- Once a Lovecraft program starts, it will only end badly.
- If a Lovecraft program “reaches the end” it will automatically start back at the beginning, possibly with fewer threads (see below)
- The only variable type is String. And all Strings are automatically encoded in an ancient language (EBCDIC) each time they are set or adjusted. You must run the decoder each time you want to do anything with the String. Note that any errors in the decoding process will cause the contents of the String to become randomized, the various characters leaping into each others’ spaces, combining and separating in a bizarre and apparently random manner.
- Strings are delimited by quotes, but you cannot use quotes inside a string. That would require an escape character, and there is no escape in Lovecraft
- The only logical operator in Lovecraft is the “if_only…alas” operator as in:
- if_only x equaled “5″ i_could_end_this_madness() alas
- There are no For loops, While, Do While or other looping constructs, other than Goto
- The entropic madness of an uncaring and soulless universe causes your variables to “decay” over time, becoming statistically less likely to contain the correct answer the longer the program runs, and the more often you access the variables.
- Note that each character in the String will degrade independently, and the probability of decay is uniform across the length of the String.
- Introspection, or any attempt to debug the variables significantly increases the chance that the variable will decay
- If you no longer need a variable, you can WasSacrificed() it. (Note the use of the past tense). Note also that, unusually, the variable name comes before the command:
- if_only x did_not_equal “42″
- alas
- Note also that the more variables you sacrifice, the more entropy will be added to the overall program, increasing the likelihood that other variables will decay, so use WasSacrificed carefully!
- Inevitably, your threads will stop operating properly as the variables decay into meaningless garbage. It is possible for the Judge thread to mark another thread as insane in order to stop it from running. However, as I noted previously, you cannot create new threads – you must continue on with the remaining threads you have. Note also that there is no definitive test of whether a thread is insane or not – the “Judge/Magistrate/Examiner/etc” must evaluate the thread and make a judgement based on its own, possibly unstable state.
- At some point, the threads of sanity will be exhausted, and your program, lurching about erratically, spouting gibberish in EBCDIC must be WasCommited(). Committing a program does not end it – it merely leaves it forlorn and alone, occupying a small cell in your computer’s memory until such day as the great User decides to terminate its Universe forever.
October 31, 2006
I learned two new things today:
grep -c
lsof
I thought I learned a third, but I can’t get the syntax right for ${var_name}, alas.
(You can find the full list here)
Gather near, grasshopper, and let me tell you of the venerable ancients of programming. These sages of the code pass their wisdom on to the young, instructing them in the ways of pointers, and objects, and closures. There is much experience to be found here, in their minds. You have only to listen.
Venerable Ancients are the experts of the programming world – the ones who have been doing it longer than some of their peers have been alive. They can tell you stories of the old days. Before the dark times. Before Microsoft.
er, where was I? Ah yes. Venerable Ancients. There are two kinds of Venerable Ancients. Those who have changed with the times, and those who havent. If you are so fortunate as to work with a Venerable Ancient who is still an avid learner, who can compare and contrast Ruby with Smalltalk, C with C#, Python with Lisp, then you ought to spend as much spare time as you can working with that person. Experience is good, but experience and adaptation? Priceless.
If, on the other hand, you work with a Venerable Ancient who seems set in their ways, who is excruciatingly well informed about one language, or one particular hardware platform, or one set of compiler tricks, then your road is more difficult. These people are often smart, and knowledgeable, but they don’t like all this newfangled stuff that keeps you away from the machine. Pointers and Drivers and hand-crafted assembler – that was real programming. These kids todays? They’re playing with toys.
Good Things
- Adaptive Ancients are usually incredibly good at solving problems elegantly and simply. Mainly because they’ve solved it 1500 times before
- Adaptive Ancients do not fall for hype, but do listen
- Both kinds of Ancients can tell you stories of the old days that will make your toes curl
- “Set in their ways” Ancients can spot and fix problems within their area of expertise faster than anyone else, usually much, much faster
Bad Things
- Adaptive Ancients rarely put up with bullshit, because they don’t have to, which makes them likely to leave all but the most developer-friendly environments.
- “Set in their ways” Ancients rarely accept change – they don’t like learning new things. (Otherwise, they wouldn’t be called “Set in their ways”
How to identify them
“Set in their ways” Ancients say things like:
- “The architecture of the PDP-10 was just art”
- “Garbage collection is for people who don’t know what they’re doing”
- “I like vi. vi works for me. I’m not going to use your stupid IDE”
- “I’m too old for this shit.”
- “I just want to see the contents of the registers. Why is that so hard?”
Adaptive Ancients say things like:
- “Ah, they borrowed that concept from Smalltalk”
- “Emacs was good, but this IDE is really powerful, once you get used to it.”
- “Wow. That’s neat.”
Update – I’ve seen enough comments on the subject that I will point out add that everyone who isn’t old enough to be a Venerable Ancient is obviously a Venerable Ancient in training.
October 30, 2006
If you want to experiment with Flex, but don’t want to pay for the full Flex Builder, the Flexifier is a great way to experiment, debug and get your hands dirty in a simple, online form.
How do I know? Because I learned a bunch of interesting things about Laszlo using the same technique.