Sunday, April 30, 2006

Pythagoras Switch

Ned posted a link to a version of a video of Japanese Rube Goldberg machines. These two links on youtube.com take you directly to the contraptions so you don't need to skip around in the video. The gadgets are really inventive. Each one ends with a little jingle and a tag in Kanji. We were wondering about the words in the jingle. In comments to Ned's post, David says that the tag says Pythagoras Switch, and that's what is sung in the jingle ("pitA,gorA,su suIchI").

A search turns up a longer explanation: Pythagoras Switch (aka Pitagora Suicchi) is an educational television show on NHK in Japan. The show targets four to six year old children to help foster and develop their powers of thinking. Here's a loose translation of the mission statement for the show:
Within our daily lives, which we go about without thinking much about the many mysteries, archetypes, themes and more varied ways of thought. For example, have you ever thought why waffles are always the same shape? Behind it all is concept of "having a shape". There [are] all sorts of these archetypes/shapes: in print, in mass-produced goods and whatnot. Understanding these these "shapes" let's you grasp how these things work.

"Pythagoras Switch" wants to help kids have that moment of A-HA! We want to raise thinking about thinking, to flip that epiphany switch in every child.
Sounds kinda cool. There are episodes of the show on youtube.com.

iPod Firmware Upgrade Irritations

I upgraded the firmware on my wife's iPod yesterday. This was the second time I've done this particular upgrade (once for my iPod). Under Windows, the upgrade is messier than I would have liked. After you install the "iPod Updater", it insists that a reboot is required to finish the install. Why? Install the firmware on the iPod and it informs you that you need to find AC power for the iPod to flash the ROM. The laptop is already providing power to the iPod and the laptop is plugged into AC, why do I need a direct connection? When I try to sync the iPod right after it's flashed, it insists that I need another reboot due to refreshed drivers. Why? I install all sorts of Windows software including drivers. Mandatory reboots are much rarer than they used to be. That's why I'm a little surprised in this case.

Maybe iPod firmware upgrades are smoother under OS X. But, truth be told, it doesn't matter to a large portion of Apple's iPod market. Apple sold 8.5 million iPods last quarter vs. 1.1 million Macs. The lion's share of iPod users are on Windows. Maybe they don't bother upgrading firmware? Possibly but if the upgrade was unimportant, why bother having iTunes pop up a dialog offering it up?

Note: I'm otherwise a very happy iPod owner. I'd probably be less irritated if I hadn't performed the same upgrade on two iPods in succession.

Saturday, April 29, 2006

Sun Microsystems' New Corporate Strategy

Now that Scott McNealy has stepped down I was curious about the sort of advice new CEO Jonathan Schwartz was getting. Then I saw this leaked diagram:

Wow, it sure doesn't look like it's all that difficult being Sun CEO. Spin the wheel, spin, spin!

Friday, April 28, 2006

Brian Levine

Congratulations to my good friend Brian on his new job at Nokia. He's going to be working on software for mobile devices.

I've known Brian for several years. We've worked closely together on great projects and some not-so-good ones — and one startup that sank without a trace. I think we get along so well because we both really enjoy developing software. It's not just a job.

Brian is bright, passionate and outspoken. The outspoken part has gotten him into trouble on occasion but he does it because he really cares. He's passionate about doing the right thing.

The best of luck, Brian. Have fun!

Thursday, April 27, 2006

Why does HAL sing "Daisy, Daisy" in 2001: A Space Odyssey?

In the movie 2001: A Space Odyssey, HAL sings "Daisy Bell" (aka "Daisy, Daisy") as Dave powers him down. Why did he sing that particular song? Jason Kottke has the answer.

Wednesday, April 26, 2006

RRRRThats5Rs

RRRRThats5Rs has a collection of odd Flash games. They're not typical games; they're intended to mess with your expectations: Enjoy them. (Via jay is games)

Code Monkeys On TV?

Ned wonders why there aren't any TV shows about software development. The day-to-day lives of most lawyers, doctors, police officers, office workers, etc. aren't jam-packed with action and hilarity and yet television dramas and comedies are based on them. Our daily grind ought to provide enough fodder for comedy along the same lines as The Office (or The Office). Until that happens, watch The IT Crowd. It's a geeky comedy about sysadmins playing on Britain's Channel 4. The episodes are available online but only within the UK. Fortunately they've also been posted on youtube.com: Episode 1, Episode 2, Episode 3, Episode 4, Episode 5 and Episode 6. (The IT Crowd link via Boing Boing)

Update: I neglected to mention that I thought Jonathan Coulton's Code Monkey would be the perfect theme for a software sitcom.

Tuesday, April 25, 2006

Mono

Mono is an open-source implementation of the .NET platform. I haven't played with it but it looks like they've made quite a bit of progress. Mono is supported on several platforms: Linux, Solaris, Macintosh OS X, Windows and other flavors of Unix.

Mono is an open source project but was primarily developed by Ximian which is now part of Novell. As in indication of how overlapping commercial and open source development can get complicated, according to the Mono FAQ, code contributions to Mono require that the author grants Novell the right to relicense his/her contribution under other licensing terms — to avoid entanglement with GPL / LGPL versions of the code.

I know very little Spanish and thus didn't realize, as the FAQ reports, the name Mono was taken from the Spanish word for monkey. And perhaps Ximian was derived from Simian?

I guess if Linus Torvald's interest in penguins resulted in a mascot for Linux, Miguel de Icaza's affection for monkeys has done the same for Mono. That's supposed to be a monkey's profile in the Mono logo.

Note: Microsoft provides a shared-source .NET implementation known formally as the Shared Source Common Language Infrastructure 2.0 Release (aka Rotor). You can download the SSCLI source from here. O'Reilly has also published a book on SSCLI — Shared Source CLI Essentials.

Monday, April 24, 2006

Thank You for Smoking

I watched Thank You for Smoking this evening. If you haven't seen the previews, it's a satirical comedy that centers on Tobacco lobbyist, Nick Naylor. It's based on the novel of the same name. The film is very funny. It lampoons everyone: lobbyists, politicians, the media, the tobacco industry, activists, etc. The cast is excellent, especially Aaron Eckhart as Nick. I could go on and on but it's easier to just say — go see it!

Note: I looked up Aaron Eckhart's entry in IMDB and noticed that he's currently working on a Scott Hick's film. The film is untitled but is clearly a remake of Mostly Martha with Catherine Zeta-Jones in the title role. Hmm. I guess that could work but why remake an already excellent movie?

The dirty word in 43 Down

It's interesting how words that were once considered offensive can enter slip into the vocabulary. According to this article in Slate, if you finished a recent New York Times crossword puzzle, your answer for 43 Down, clued as "Scoundrel," was SCUMBAG. The word's offensive origin is mostly forgotten and is now just used to describe someone who's despicable.

Another word that's in common usage, despite it's origin, is sucks. Used in the right (or wrong) way, it's still offensive but doesn't have the same sting that it once did.

But Americans seem to be more likely to forget or ignore a word's origin than other cultures. Tiger Woods recently discovered this when he used the s-word (no not that one). And President Bush discovered this a few years ago when he used a word that's considered a racial slur elsewhere.

Sunday, April 23, 2006

Tulip Festival

We had beautiful weather this weekend in Seattle. Clear blue sunny skies on both days. Last night we watched the sun set over Lake Washington. It stays light later here than in Boston — the light from the waning sun was still visible after 9pm.

On Saturday we drove up to Skagit County for the annual Tulip Festival.

Tulips

This was our first experience with the tulip festival. Next year we need to get an earlier start. The traffic can get pretty bad. It's amazing how popular tulips can be. The crowds remind me of the Autumn "leaf peepers" in New England.

Note: I finally started using my Flickr account. You can see a larger version of the photo by clicking on it.

USA National Gas Prices Map

USA National Gas Map is a color-coded map showing the average price of gasoline in each county. Most of the variation is due to state and local taxes. The cheapest gas can be found in Idaho and Wyoming, the most expensive in Hawaii, New York and California. Washington State and Massachusetts prices are comparable.

I guess we shouldn't complain so much about $3 per gallon gasoline — in Europe gasoline prices exceed $5 per gallon.

More Blue Ball Machines

As a follow-up to my post on Blue Ball Machines, here are some more:By the way, if you're curious about the energetic music used in the original Blue Ball Machine (and some of the sequels), it's from Pee-wee's Big Adventure. (Via Jamie)

Debugging 101

An interesting essay on Debugging by Mr. Ed of Hacknot. It's good stuff but I don't agree with his sentiments about symbolic debuggers:
In general, I recommend you avoid symbolic debuggers of the type that have become standard in many IDEs. Debuggers tend to produce a very fragile debugging process. How often does it happen that you spend an extended period of time carefully stepping through a piece of code, statement by statement, only to find at the critical moment that you accidentally "step over" rather than "step into" some method call, and miss the point where a significant change in program state occurs? In contrast, when you progressively add trace statements to the code, you are building up a picture of the code in execution that cannot be suddenly lost or corrupted. This repeatability is highly valuable - you're monotonically progressing towards your goal.
While I agree that tracing is invaluable, especially when you're trying to diagnose a customer issue, I don't think this precludes the use of debuggers. That said, I agree with his observation that some developers rely too heavily on debuggers:
I've noticed that habitual use of symbolic debuggers also tends to discourage serious reflection on the problem. It becomes a knee-jerk response to fire up the debugger the instant a bug is encountered and start stepping through code, waiting for the debugger to reveal where the fault is.
We used to refer to developers like this as "debugging the code into working".

Saturday, April 22, 2006

Special Winning Attitude Team?

At a previous employer, one of our project teams was in crisis. They had a number of issues and dependencies that needed to be resolved quickly. So the project manager decided to establish a cross-project SWAT team to focus on getting this work done. It's not an unusual move, especially when there are a lot of project interdependencies. But in this case, the manager who established the team insisted that the acronym stood for "Special Winning Attitude Team". When I read the explanation in an email, I nearly choked. It's unlikely that you'll find a better demotivational tool for software developers than a phony exuberant name like this. It's a transparent attempt to spark enthusiasm. And, in this particular organization, the team was already pretty demoralized, which made it even worse.

Which brings me to an article I just read: Why Your Employees Are Losing Motivation. Here's the first paragraph:
Most companies have it all wrong. They don't have to motivate their employees. They have to stop demotivating them.
It goes on to describe how employees start a new job with great enthusiasm but in most cases morale sharply declines after their first six months — and continues to deteriorate for years afterward.

How do you keep this from happening? According to the article, management must understand the three sets of goals that the great majority of workers seek from their work — and then satisfy those goals:
  • Equity: To be respected and to be treated fairly in areas such as pay, benefits, and job security.

  • Achievement: To be proud of one's job, accomplishments, and employer.

  • Camaraderie: To have good, productive relationships with fellow employees.
If you're a manager (or managed) the rest of the article is a good read.

Friday, April 21, 2006

Go down a storm?

I just read an article that used the phrase "go down a storm". I had never heard this expression before so I did a web search, finding quite a few hits. From the context, it appears to mean that something or someone was incredibly successful. I wonder if it's equivalent to the expression "to take something/someone by storm"?

Dungeon Escape

Dragon's Lair was a laserdisc-based arcade games that featured Disney-quality animation created by former Disney animator Don Bluth. It looked wonderful but the gameplay was frustrating. You had to anticipate exactly when and where to click in order to keep your character from getting killed. Getting through the entire game would consume an awful lot of quarters — now you can just watch the entire game in video form.

Dungeon Escape is a Flash-based homage to Dragon's Lair. The graphics are crude but it's fun. Unlike Dragon's Lair it provides flashing oval hints that tell you where to click. (Via jay is games)

Thursday, April 20, 2006

NeXT OpenStep up and running on a MacBook Pro

I may be one of the few people who find this interesting. Mac on Intel reports that they were able to get NeXT OpenStep 4.2 up and running on a new Intel-based MacBook Pro.

The install under Parallels Workstation went with few hitches and the system is very responsive. Now I wonder where I could find a copy of OpenStep for Intel? (Via O'Reilly MacDevCenter)

You used the air that costs money!

A silly prank was played on University of South Carolina Student Body Vice President Ryan Holt. He didn't take it too well:


Look at me being serious!

I see a bright future for Ryan as a pointy-haired boss. (Via BoingBoing)

Google Calendar Data API

Google has just released the Google Calendar Data API which allows client applications to view and update Google Calendar events in the form of Google data API ("GData") feeds. Looks pretty nice and includes client libraries in Java and C#.

Fantomah

Here's a superhero(heroine?) that I'd never heard of before. Fantomah appeared in Jungle Comics during the 1940s. Her superpowers were a little vague — she could fly and turn her head into a skull (?) but depending on the context, she was able to do other things as well: become invisible, control the forces of nature, etc. The Fantomah strip was both badly drawn and pretty disturbing.

In this episode, the bad guy creates a race of killer gorillas to conquer the world. Fantomah foils his plan, of course, but not before tossing him into the middle of a pack of his killer gorillas who tear him apart — his dismembered arms and legs are shown flying into the air.

In another episode, Professor Zomax gets the snot kicked out of him by lions, snakes, apes, poisonous gnats, etc. Somehow he survives and — surprise! surprise! — he holds a major grudge against all living creatures of the world. He creates a massive tidal wave to destroy the earth. Fantomah reverse the tidal wave and Professor Zomax dies as his parachute conveniently lands right in the middle of the tidal wave.

The violence in Fantomah is surprisingly graphic compared to the comics I remember reading as a kid. The bad guys got caught not dismembered. But Fantomah predates the creation of the Comics Code Authority which toned down a lot of the violence and gore that existed in comic books back then.

America's Secret Plan to Invade Canada

Canada and the United States are friendly neighbors, but at one time both nations had somewhat detailed plans for attacking one another ... just in case.

The US plan was devises in 1934. It was called War Plan Red. The scenario imagined a conflict with England and its Commonwealth and the United States fighting over vital international trade and commercial interests.

The Canadians developed their plan in 1921. It was called Defence Scheme Number One. It called for Canadian soldiers to march on Albany, Minneapolis, Seattle and Great Falls, Montana. And then to wait for the British to arrive and help their Commonwealth ally.

The impression I get from the details is that the creation of these plans was more an exercise in war planning than a serious effort. Nevertheless, it makes you wonder which countries still have contigency invasion plans for their neighbors. (Via James Robertson)

Geez

Every so often I look at this blog and realize that I'm still using a lame Blogger-derived hacked-to-death template. One of these days, I'm going to have to do some cleanup to make it less ugly. Note: if you're reading this via a Feed Reader such as Bloglines, you've been spared.

Wednesday, April 19, 2006

Paul Graham on Boston and Cambridge

Paul Graham just returned to Boston after being in California for a while. He's written his impressions of seeing Boston with new eyes upon his return. I don't agree with everything he says but he's definitely got a good point about crappy infrastructure.

Here in Seattle, public works projects just seem to get done properly. In Boston, bridges crumble, roads don't get repaired quickly enough, etc. And considering all of the billions spent on The Big Dig, couldn't they spend some of that money on "fit and finish"? The Zakim Bridge is beautiful, but when you look at the walls and concrete in the tunnels, they just doesn't that look good. Fortunately, most of it is underground. And the tunnels got rid of the ugly elevated highway that separated the North End from the rest of the city.

I spent nearly my entire adult life in Boston. After being away for nearly a year, I'll be visiting Boston in June. It'll be interesting to see the city again with new eyes.

Five Truths About Code Optimization

Russ Olsen's essay Five Truths About Code Optimization is a quick read but does a good job of covering the basic truths of optimization:
  1. Start with working code and good tests or you are doomed
  2. Rest assured, you don't know where the problem is
  3. There is always a long pole in the tent, but it is not always the same pole
  4. If it doesn't help, take it out
  5. You need to know when to stop
I had to laugh when I saw Russ' example for his second "truth" — I ran into the same issue with the RandomAccessFile class in Java when I was trying to speed up code that processed PDF files. RandomAccessFile does unbuffered IO which can be incredibly slow. In my case, switching to buffered IO reduced processing time by more than 95% for large files.

Apple to build new 50-acre campus in Cupertino

Microsoft has eight million square feet of office space in Redmond. But given the company's rate of hiring, it's not enough. The company plans to add another two million square feet of office space in the next decade to house an additional 10k-12k employees. But Microsoft isn't the only tech company with office space expansion plans. Apple has outgrown its Cupertino campus and is planning to build a new 50-acre campus in the next few years, also in Cupertino. It's kind of weird to watch the video of Steve Jobs presenting Apple's plans to the Cupertino city council.

Energizer Stack Trace Redux

A while ago I blogged about Energizer Stack Traces. Volker points out another example as the Longest 404 page ever. It was supposed to be a link to Mary Beth Raven's blog but the server returned an error page that's the result of an error raised when it builds the error page. How do I know this? By looking at the error message:
The server cannot use the error page specified for your application to handle the Original Exception printed below. Please see the Error Page Exception below for a description of the problem with the specified error page.
Detailed error messages like this are extremely useful for developers. The stack trace is useful too. But is this ever reasonable behavior for a web application server in a production environment? The error message and stack trace should be logged on the server-side. If an exception is raised while generating a page, it's a bug. There's no earthly reason to get the end user involved. Worse yet, including a detailed error message and stack trace is information leakage that might be useful to a hacker.

Thursday, April 13, 2006

Referential vs. Experiential Bloggers

Greg Knauss has an interesting post on his theory that there are two types of bloggers: Referential (Look at this) and Experiential (How about this). I'm mostly in the Referential camp. The point of most of my posts is to call attention to a link. But I usually try to connect links with personal experience or commentary when I can.

Google Calendar

Google Calendar is live. My initial attempt to create my calendar returned a Server Error page but after a refresh things were fine. Here are my initial impressions: It has clean Google-ish UI. It's well integrated into GMail — as are more and more Google apps (such as Google Talk). It support multiple calendars. There are some nice calendar sharing options. You can import calendar events from various sources and export to iCal. You can also set up a private URL address to get at XML or iCal representations of your calendar.

Wednesday, April 12, 2006

It's Enterprisey!

Here's a terrific new meme: Enterprisey

According to the Wikipedia entry, this meme started in a posting on The Daily WTF by Alex Papadimoulis:
Today's example was actually submitted by a few different people over a span of a couple months and is from the data-access layer of an enterprise .NET application. For you non-enterprise developers, here's an easy way to make your applications more enterprisey: add lots and lots of constants.
Now James Governor has used it in a post about someone joining IBM to work on Ruby:
If IBM is hiring Ruby skills then Ruby is enterprise. That may seem like circular logic, but the reality is that IBM, more than any other individual or organisation, still defines what is and what is not "enterprise". If IBM is investing in an area, you can be pretty sure its going to be used in enterprise contexts.

If IBM supports it, its enterprisey.
Given how some people love to throw around the word enterprise, I love this new meme. It's the perfect diminutive of an overblown term.

Note: when I mentioned enterprisey to a co-worker, he compared it to truthy which comes from Truthiness (i.e. truthiness means "truthy, not facty").

public vs. published interfaces

There's an interesting discussion on Lambda the Ultimate about the distinction between public and published interfaces. Published interfaces are a contract with clients. They won't be modified in such a way that they break client code. In contrast, public interfaces don't provide the same contract — they're unpublished and can change.

This is a language-specific issue. There's no way in Java to make a distinction between public classes and methods that are intended as part of a published API and those that are intended only for internal consumption. Yes, you can limit Javadoc to only published APIs but there's way to enforce this in code. Tracking usage of unpublished APIs can be a real headache, even within the same project or the same company.

There are preliminary plans to start a new JSR to add a module-like mechanism to Java called superpackages to provide enforcement — or at least to make it harder to use unpublished APIs.

In the .NET world, code is built into assemblies. Assemblies are similar to JAR files but they have language support. The "internal" scope modifier indicates that a type/method/etc. is only accessible by other code within the same assembly. In .NET 2.0 there's support for friend assemblies that allow internal types to be accessible only from other "trusted" assemblies. The only downside to this approach is that an assembly has to declare who its friends are in advance.

Java and Lisp

Richard Cook's recent blog post, provides an interesting contrast between the Java and Lisp worlds.

On the Java side Richard references Ed Burnette's article Better, faster, stupider Java. Ed feels that the flurry of new Java language features "make Java less great". A big part of Ed's concern is that by taking advantage of these new features, programmers are effectively shutting out anyone who needs to support older versions of the language.

On the Lisp side Richard quotes Peter Seibel's description of Common Lisp macros in which he notes:
DOLIST is similar to Perl's foreach or Python's for. Java added a similar kind of loop construct with the "enhanced" for loop in Java 1.5, as part of JSR-201. Notice what a difference macros make. A Lisp programmer who notices a common pattern in their code can write a macro to give themselves a source-level abstraction of that pattern. A Java programmer who notices the same pattern has to convince Sun that this particular abstraction is worth adding to the language. Then Sun has to publish a JSR and convene an industry-wide "expert group" to hash everything out. That process--according to Sun--takes an average of 18 months. After that, the compiler writers all have to go upgrade their compilers to support the new feature. And even once the Java programmer's favorite compiler supports the new version of Java, they probably still can't use the new feature until they're allowed to break source compatibility with older versions of Java. So an annoyance that Common Lisp programmers can resolve for themselves within five minutes plagues Java programmers for years.
So Java programmers have to convince Sun that a new feature is needed and then wait for them to add it (and then complain about it!) while Lisp programmers just go add it themselves.

Lisp macros makes the language incredibly malleable. Adding a new block construct such as foreach is trivial. This makes Lisp more powerful but with power comes substantial responsibility. Does this approach scale? Does this approach promote reuse and common libraries? I've worked on projects with hundreds of Java programmers but the largest Lisp project I ever was involved with had only five developers. Since Lisp is so malleable, how would a large project avoid lots of little local dialects?

Maybe I'm just looking at this in the wrong way. Perhaps, as Richard Gabriel has written, Java and Lisp are intended for different purposes:
The difference between Lisp and Java, as Paul Graham has pointed out, is that Lisp is for working with computational ideas and expression, whereas Java is for expressing completed programs.
Viewed in this way, it's unlikely that you'd find more than a handful of Lisp developers working together.

Quickly Erasing 'I' and 'B' and 'M'

Is Lenovo moving too quickly to distance itself from IBM? Since Lenovo took over the IBM personal computer business last May, the company's advertising and marketing efforts have excluded IBM almost entirely from the message. That's a little surprising since part of the deal included the rights to use the IBM name for five years after the deal was completed. But the brand awareness was specifically around the ThinkPad name and reputation, not as much about IBM. The IBM brand in the PC business wasn't that strong. So maybe Lenovo is making the right move by quickly identifying themselves with the ThinkPad brand and expanding their own brand name from there.

Tuesday, April 11, 2006

The Development Abstraction Layer

Joel has a terrific new essay The Development Abstraction Layer. Funny, I was just thinking about this aspect of software development the other day.
Software is a conversation, between the software developer and the user. But for that conversation to happen requires a lot of work beyond the software development. It takes marketing, yes, but also sales, and public relations, and an office, and a network, and infrastructure, and air conditioning in the office, and customer service, and accounting, and a bunch of other support tasks.

But what do software developers do? They design and write code, they layout screens, they debug, they integrate, and they check things into the source code control repository.

The level a programmer works at (say, Emacs) is too abstract to support a business. Developers working at the developer abstraction layer need an implementation layer -- an organization that takes their code and turns it into products. Dolly Parton, working at the "singing a nice song" layer, needs a huge implementation layer too, to make the records and book the concert halls and take the tickets and set up the audio gear and promote the records and collect the royalties.

Any successful software company is going to consist of a thin layer of developers, creating software, spread across the top of a big abstract administrative organization.

The abstraction exists solely to create the illusion that the daily activities of a programmer (design and writing code, checking in code, debugging, etc.) are all that it takes to create software products and bring them to market. Which gets me to the most important point of this essay:

Your first priority as the manager of a software team is building the development abstraction layer.
As as developer, you may be oblivious to all of the other activities that go on around you. You just write code. But if you move into management or go off and do a startup you quickly realize that there's a lot more to the software business than cranking out code.

Famous Rapper Or Dead Author?

Famous Rapper Or Dead Author? I got 13 out of 20. More than half of my answers were pure guesswork. (Via Cameron Moll)

Monday, April 10, 2006

Macintosh Ads Circa 1984

When Apple announced Boot Camp to allow Windows to be installed on Intel Macs, I thought back to Apple's early Macintosh advertising campaigns comparing Macs to IBM PCs. GUIdebook has collected the earliest Macintosh print ads from 1984 including the advertising copy. This passage is particularly amusing:
At Apple, we only have one rule:
Rules are made to be broken.
Take "Thou shalt be compatible with IBM?" for instance.
We decided there was something more important than building a computer that's compatible with another computer.
Namely, building a computer that's compatible with people.
I guess now it's finally time to be compatible with other computers — except PCs are no longer made by IBM. And in fact, the move to Intel was actually a move away from IBM technology. (Via Gizmodo)

Dissecting a C# Application: Inside SharpDevelop

SharpDevelop (aka #develop) is a free open-source IDE for C# and VB.NET. It's pretty sophisticated. It includes a Forms designer, supports code completion, has integrated NUnit support, includes a plug-in mechanism, etc. And it's entirely written in C#. The IDE as well as its source code can be downloaded from here.

Dissecting a C# Application: Inside SharpDevelop was written by the SharpDevelop team to provide a guided tour of the source code. The book can be downloaded for free in PDF format from here.

Note: the publisher, Apress, has several other interesting software books that can be downloaded for free as well. The list is available here.

dive into mark

After an eighteen month hiatus, Mark Pilgrim has started blogging again.