Thursday, November 02, 2006
Configuration API Convoluted?
I'm having an evening when I can't believe what is wrong with me because something that should be trivial is giving me hell.
Our application has had connection strings littered all over the place - okay, 8 to be exact and I know this because of my frequent usage of "replace in files" to toggle connection strings. But we're at a point when this needs to be centralized and mutable without doing a new build.
In my head this is simple: slap a config file into the project and off I go. Some kind of one liner along the lines of:
ConfLib.CONNECTION = ConfigurationSettings.AppSettings["Connect"];
Simple, right? I do it with web applications all the time.
The first issue is that ConfigurationSettings, which the old school .NET folks are used to, is deprecated. The message tells you to use ConfigurationManager but neglects to mention that a physical reference to System.Configuration.dll (in the GAC) is needed. This isn't a big issue and 2 minutes later I've referenced it, and rewritten my line of code as:
ConfLib.CONNECTION = ConfigurationManager.AppSettings["Connect"];
Not quite. I'm now in the habit of doing unit tests so I realize that Visual Studio 2005 copies your libraries to a new directory when it does unit tests. I look at the "post build event" options and wonder if it's worth the hassle. So instead I ditch the unit test and return to the main solution, manually copy the *.config file into my application's directory and try.
No dice.
Maybe ConfigurationManager is too nebulous? So I try the following:
Configuration conf = ConfigurationManager.OpenExeConfiguration("ConfigHelper.dll");
Which, when I run it in the debugger seems to pull my keys out of the config file but gives me an access violation when I try:
ConfLib.CONNECTION = conf.AppSettings["Connect"];
This is quite some time later and I'm pretty annoyed because I must have absolutely not gotten the memo or configuration is bloated. Almost to prove to myself how simple this should be, I create a file called Settings.xml and put in a couple of elements and write the following:
XmlDocument configDoc = new XmlDocument();
configDoc.Load(Path.Combine(Directory.GetCurrentDirectory(), "Settings.xml"));
ConfLib.CONNECTION = configDoc.SelectSingleNode("//Database/text()").Value;
ConfLib.VERSION = configDoc.SelectSingleNode("//Version/text()").Value;
That simple.
Granted I am WELL AWARE that the Configuration API has lots of goodies stuffed into it but should that make the process of pulling it out of a configuration file so convoluted? Things that are designed well work for the simple things as easily as they solve the complex.
My configuration files always have the same pattern: I create a class that is designed to read the xml file with static variables for each configuration value. I use a static initializer to read these from the file and have a single static variable I reference when the app is loaded. I've worked on a lot of stuff that benefits from this but almost always configuration stuff seems to boil down to a simple name/value pair you can leverage.
I could have made an indexer and had the pulling look like the AppSettings collection on the ConfigurationManager but I dislike the fact that the compiler doesn't catch errors related to misspelled key names.
Oh well, I'll leave it in its current state. Maybe I'll get the memo tomorrow but I doubt it.
}
Tuesday, October 31, 2006
Classpath struggle, even the Jedi
Larry O'Brien, well known Jedi Master of many things development posts:
"I have to wire up a ColdFusion to an Axis Web Service. I've spent the past 3
hours trying to figure out freaking classpath issues: something about a
ClassCastException from a org.apache.commons.logging.LogFactory. I'm giving up
for the day. Stupid freaking classpaths."
I can remember sitting in my one room apartment above a garage in Whittier fighting with classpaths, trying to wrangle them into my understanding of Java. It is not schadenfreude that makes me post this, it's more the comfort of knowing that I'm not the only one to have struggled with them.
}
Friday, October 27, 2006
Friction
Reading Joel Spolsky and others on the hring process is always interesting. One aspect of their writing that has always intrigued me has been the "quiz questions" used to get a feel for the interviewee's level of intelligence.
Lately I've been interviewing people regularly and am slowly coming up with a format that gets me closest to a person's technical level as it pertains to our company. I usually ask a person to rate themselves on a scale of one to ten in three areas:
1. Web Application Development (HTML / CSS / Javascript / ASP.NET (or any other web app framework or perl/scripting env)
2. "Fat" clients (Windows Forms .NET / COM )
3. Database programming and administration (SQL / Database Design)
I then follow up their ratings of themselves with some general questions in each area. For example, most people consider themselves knowledgable with web development because they know some basic html. Questions I like to pose here may be along the lines of asking what the difference is between DIV and SPAN elements, or what their understanding of why XHTML (versus HTML 4.0) came into existence, or whether they think designing with tables is a bad idea. On the programming side I like to ask a person about the postback cycle in ASP.NET, or if they come from a non-.NET environment, about something like state management (querystring, session, etc...) in web applications. Another favorite area of mine is javascript since many people think they know it but can't provide answers for even a simple question like how to register an event for an html element. When I ask questions the point is definitely not about trivia but more to gauge whether the candidate is about aptitude or whether they'd be capable of jumping right in the fray and making a contribution.
But beyond the technical questions, beyond the idea of "Smart, Gets Stuff Done" as goals in the ideal candidate, probably the most important thing about working the environments I've been exposed to is learning how they deal with "Friction." I was watching a panel show once on CSPAN where a wizened old military man said: "The difference between war plans and war is friction." As I understand it, friction has to do with all those little things (and big things) that go wrong. In our case, friction is almost always involved in trying to hit release dates. Friction is also a big player when it comes to team dynamics and how people treat each other.
For all the talk online about people who are exceptionally smart and productive, I'm surprised that the question of friction isn't more important when choosing programmers since friction is always a part of software development. Everyone's got a story about this, but here's mine: I worked with a guy who was exceptionally sharp, anal-retentive, and detail oriented. He'd forgotten more within his discipline than I probably will know. I would ask him from time to time for help on the little problems I was dealing with and his answers were always prompt and accurate. We worked together as peers and that's what made me capable of liking him however, for many people, he was nearly impossible to deal with because any change that required flexibility on his part was out of the question. If I'd been a team lead on a project, he'd be a difficult decision because of this attitude, and what would push me from the "maybe" into the "no" decision would not be my own ability to work with him, it would be his affect on the team as a whole and how he affected the team's group culture.
One thing to bear in mind is that I'm a consultant who writes business-ware which may mean that friction comes up for me a lot more than someone working at a shrinkwrap company, or a behemoth powerhouse with zillions of great hackers. But as my experience accumulates, I begin to see that a person who has the ability to calm a client down while being able to refocus and get a project out the door is more valuable than a person who is a brilliant programmer but unable to deal with the type of rapid change and improvisation necessary for our work.
}
Tuesday, October 24, 2006
Commands and Abstractions
I clash with people occasionally over my approach to SQL Server. My approach to SQL Server is quite simple: Transact SQL. Never one for layers of abstraction and always seduced by speed, I prefer to keep my management activity in Query Analyzer. SQL Management Studio seems a bit slower than its older cousin, so quite often I prefer Query Analyzer even with the brand new SQL Server 2005.
Often times for me preferences like this develop after bad experiences but today was a reminder of what kinds of things a layer of abstraction is capable of doing behind your back if you don't monitor it. We have a table with 82 columns and something like 50,000 rows. One of these columns needed to be extended from VARCHAR(10) to VARCHAR(50). I was walking through the steps as they may occur in Enterprise Manager so I opened the product (wait a few seconds), selected my database (wait a few seconds), opened the tables node (wait a few seconds), and then right clicked on my table to examine and manipulate the column (another few seconds, plus scrolling up and down to locate the column I wanted). I made my change and then proceeded to make a "change script" which, to my horror, creates a temp table, copies data and affects other tables referenced by the table whose column I was changing.
My usual approach to something like this is the following: Start->Run (Instantaneous). "isqlw" and hit enter (Instantaneous). In the query window I type the following:
1 USE MyTestDatabase
2 GO
3
4 ALTER TABLE Foo
5 ALTER COLUMN Bar VARCHAR(50)
6 GO
The point for me really veers from SQL Server at this point and gets into the question of the abstractions which I myself rely on unnecessarily - which prevent my thinking to get past a certain point. Although I have come to rely on the command line more and more over time, there are still things I learn: DOS things! that have really changed how I think about certain types of problems. A simple example of this is from a few months ago when I learned of the existence of pushd and popd, commands for storing and retrieving working directories on a stack. These relatively trivial techniques make it easy to do things that never really occured to me before. Like the fact that I could just use fc to check for differences in files. Or piping a request for help to a file so I could have documentation for a command. Here is an example that might be interesting: wsdl.exe /? >wsdlParameters.txt
One last point of clarification: I am not against abstractions. In many instances they work quite well. A while back I wrote a web based tool for viewing objects in SQL Server databases - basically outputting queries to the Information Schema views. Everything that tool does can be duplicated in query analyzer or in SQL Management Studio. But in terms of raw speed, flipping back and forth on table definitions in the web based tool beats clicking around in the GUI or retyping the same select statement with a different table name in the where clause. What I believe is that abstractions are used best when what they are hiding is understood fully. This is counter intuitive; most people think the abstractions - an easy GUI, a simple command, and so on - are there to make things simpler for people who want to keep details hidden. That is always dangerous, even when it's effective. I'd prefer to struggle with what's underneath and then live blissfully choosing the abstractions I find useful.
}
Monday, October 23, 2006
Serious Reading
Chris Sells answers a few questions in public but one comment got my attention:
Wow: three to five books in a week for "immersion." It's a stark reminder on a personal level of how much more aggressive I need to get with my own reading list (which, incidentally, includes Sells's Windows Forms Programming) but in a general sense it shows a hallmark of what the information age does to programmers - it might not be intelligence that separates us (though I think Sells is remarkably intelligent), it's the ability to absorb information quickly.How are you able to keep up with the changes? What books do you read?
[csells] I keep up with changes by a) a broad familiarity with as much technology as possible and then b) committing to using it because it feels like it’ll be the right thing and c) using fear to motivate me (recognize a pattern? : ). I read books on demand given the topic I’m into, and then it’s 3-5 books in a week for immersion. Frankly, after writing a few books, I’m a bit of a snob, so I don’t read a lot of technical books for fun the way I used to.
I don't read very quickly so it's a matter of discipline and will to work on absorbing what's relevant for the job and the future. But in a word where guys like Sells chew up and spit out technologies before most people are seriously working with them, a person needs a good reminder of staying focused.
It reminds me of the brief exchange I had with Hanselman. I'd ask a question, he'd casually suggest a book. It says, to me, that there's a bit of mysticism to how smart people like that stay on top of things but really that the information is out there and ready to be consumed if only one is disciplined enough to pursue it.
}
Tuesday, October 10, 2006
Windows Forms for Visual Basic 6 users
My current project at work is a Windows Forms application. Even though I've been programming .NET almost daily since it's introduction, just about all of what I've done is web based programming using ASP.NET. The non-web code I've written has been for the most part libraries (DLLs) to use in web apps.
Most of what I know about thick clients comes from doing work in Visual Basic 6 so while I usually know where I'd like to go with something, I find myself hitting a wall with how to do it in VS 2005.
An example of this would be this morning, trying to figure out whether the Locked property for controls is ported to .NET Windows Forms. Unfortunately it's not - the Locked property you find has to do with resizing and moving, not making controls editable.
Fortunately MSDN has a great resource here for people making the transition that lets you see Visual Basic 6.0 and Windows Forms compared directly.
}
Sunday, October 08, 2006
Rhino Book
I got David Flanagan's new Javascript Reference earlier this week. My fourth edition is nice and worn, but it will be nice to have the updated perspective since so much has happened in internet time since the fourth edition was published. It's the third edition of the book that I've owned and while buying the same book more than once has a big psychological drawback, I'm especially looking forward to reading the sections on the XmlHttp (AJAX) side of javascript.
}
Saturday, October 07, 2006
Firefox Hiding Namespaces! ARG.
For a while I've had people ask me how I did my photoblog and because I wrote it from scratch it's not really useful (and it's definitely "Me-ware": unusable to just about anyone but me). I always direct people towards Flickr but it doesn't have the photoblog experience quite like mine and other photoblogs.
This weekend I've been writing a tool called Flickr-Fu that grabs the RSS feed from Flickr and attempts to simulate the photoblog experience allowing a user to navigate forward and backward one photograph at a time. The RSS xml structure is extended by Yahoo with it's own namespace: http://search.yahoo.com/mrss - all such tags are given a "media" prefix to distinguish them from the structure of RSS 2.0. Using XPaths with .NET is pretty straight forward until you run into the namespace issue, at which point there is a class XmlNamespaceManager that you will need to tame in order to get the job done.
But before this point I was hitting my head against a wall: I could see the media:content tag that I needed to get the image URL but I could see no namespace associated with it! It doesn't follow as well-formed XML to have namespaces without some namespace URI but sure enough, Firefox was hiding the namespace URI. I pasted to IE and was able to get a proper reference to use with the XmlNamespaceManager. What a strange thing to display XML in a stylesheet but leave off the namespace references in the root element! Just to prove I'm not hallucinating, here's a screen cap:
Once the namespace issue was cleared up for me, the code was quite simple:
21 XmlNamespaceManager spaceManager = new XmlNamespaceManager(doc.NameTable);
22 spaceManager.AddNamespace("media", "http://search.yahoo.com/mrss");
23 linkToBig = xnItem.SelectSingleNode("media:content/@url", spaceManager).InnerText;
Flickr-Fu is a work in progress but you can have a look here.
}
Friday, October 06, 2006
Raganwald Responds
I had posted about Yegge's Agile/agile essay, trying to follow some of the interesting comments that ensued on the web. I made the following comment about Raganwald's response:
"Raganwald has the most interesting response
I've seen so far: that it all comes down to people over process and a good team
will succeed despite methodological strategy. "
He has since posted an elaboration in response on his blog - I was a little off in my reading:
"No. I'm saying that a "good" methodology cannot save a bad team. That does not
mean that a good team can survive a bad methodology. There are four
critical parts of a successful software project, and in my experience you
cannot succeed if any of them are missing. People are the first of those,
management the last. Methodology is a part of management in my view. In some
situations, strong management can impose an informal rather than a formal
methodology. But it would be stretching a point to claim that such situations
lacked process or had a bad process."
}
NULLs in subqueries
Here was an interesting issue we ran into this week. I haven't run into this before and thought I should share - a friend was using a subquery to filter and because of NULL results in the field his result was an empty set.
My approach to things like this is usually to use a join rather than a subquery and ultimately that's how we saw how Microsoft SQL Server was processing things. But this behavior is quite subtle so I'm posting since a person running into the same issue may Google there way to this entry:
1 CREATE TABLE #TRAN(
2 TRANID INT,
3 TRANNAME VARCHAR(50)
4 )
5 GO
6
7 CREATE TABLE #ACH(
8 ACHID INT IDENTITY(1,1),
9 ACHNAME VARCHAR(50),
10 TRANID INT NULL
11 )
12 GO
13
14 INSERT INTO #TRAN VALUES(1,'TRANSACTION A')
15 INSERT INTO #TRAN VALUES(2,'TRANSACTION B')
16 INSERT INTO #TRAN VALUES(3,'TRANSACTION C')
17 INSERT INTO #TRAN VALUES(4,'TRANSACTION D')
18 INSERT INTO #TRAN VALUES(5,'TRANSACTION E')
19
20
21 INSERT INTO #ACH VALUES('ACH 1A', 1)
22 INSERT INTO #ACH VALUES('ACH 2A', 2)
23 INSERT INTO #ACH VALUES('ACH 3A', 3)
24 INSERT INTO #ACH VALUES('ACH 1B', 1)
25 INSERT INTO #ACH VALUES('ACH 1C', 1)
26 INSERT INTO #ACH VALUES('ACH 3B', 3)
27 INSERT INTO #ACH VALUES('TEST',NULL)
28
29 -- RETURNS NOTHING
30 SELECT * FROM #TRAN
31 WHERE
32 TRANID NOT IN
33 (SELECT TRANID FROM #ACH)
34
35 -- RETURNS TRANID 4,5
36 SELECT * FROM #TRAN
37 WHERE
38 TRANID NOT IN
39 (SELECT TRANID FROM #ACH WHERE TRANID IS NOT NULL)
}
Saturday, September 30, 2006
People, Process
Steve Yegge has a post about the agile software development process. Gifted in wit and sarcasm, Yegge doesn't spare many punches in basically saying that "Agile" as is known as a process is basically about marketing and making money for consultants. He contrasts this with a lower cased "agile" which is what he believes Google (his employer) practices and others should.
A lot of comments seem to be coming back - resistance to Yegge's comments over at The Mindset because (and I agree with this) some of the things that are true for Google (working without deadlines) just can't be true for the rest of us. The Mindset also doesn't believe that the glossy, non-substantive Agile flies with most businesses. I'm not as optimistic as The Mindset since I have seen many an organization fleeced, but I do agree that most people aren't fools. Especially developers, the majority of which I've worked with are big skeptics.
Raganwald has the most interesting response I've seen so far: that it all comes down to people over process and a good team will succeed despite methodological strategy. Interesting because especially when it comes to Google, it seems like they take the cream of the crop so it would follow that they can be so lax with all the rock stars they have working there. Raganwald seems to fit into Spolsky's camp (maybe it was Raganwald's camp to begin with) where the equation is: Good programmers + working conditions == Great Software
Dare Obasanjo is pretty straight forward with how he sees Google:
"'smart people dicking around' type projects" versus "shipping code."
It doesn't get more plain than that now, does it?
Quite interesting especially since it wasn't long ago that I listened to Jutta Eckstein talking about Agility on Software Engineering Radio. The first thing out of her mouth was:
"People over process."
I think there's a lot of frustration in the marketing and money making of Agile but the finer details seem to have a lot of things that are great tactics in software development. "People over process" is a great way for the Agile methodology to begin itself since it allows for the Raganwald/Spolsky perspective but many of the communication things are good as well. What Yegge points out as "agile" in the sense of big rewards and incentives seem to have to do with compensation, not necessarily development methodology. Pair programming, as far as I know isn't a part of Agile but this is something I've never really seen as a full time approach. One thing I've been struggling with in my current project is the weight given to doing frequent releases in Agile. Because we started from scratch it doesn't make much sense and in this case we are departing from conventional Agile. However as the framework for the software begins to take form I'll push the team for more frequent builds that the client can look at. For now, scaffolding and putting things together for others takes far too much time and all the client would see is unfinished stuff that we are well aware is unfinished. Doing "SCRUM" meetings is another departure for us - we meet when necessary but there's enough on various plates to make meeting and percentages too much overhead.
In the end I find myself seeing truth in each person's perspective: Yegge is right about some of the dogma (whether it was intended or not is another question) some apply to Agile programming. The Mindset is right that those of us who don't work at Google don't have the luxury of working without a deadline. Raganwald is absolutely right on the importance of hiring. I did two interviews this week and that was... interesting. People, especially the caliber of whom work at Google, just aren't a reality for where I work. I include myself in that category since I'm not certain I'd fare too well in their hiring process.
}
Wednesday, September 27, 2006
Do you test your work?
Most places I've been people would nod and look at you with disdain. But I can't think of a person I've met that is as rigorous as this. (Courtesy of CodingHorror)
Testing seems to have less to do with technical proficiency (what gets you the initial result) and more to do with tenacity. I'm hoping it's like a muscle too - the more it is exercised, the more anal retentive I'll become about the lengths I go to check my work.
}
Monday, September 25, 2006
Eric Sink: Code Cover, Unit Tests
A good essay I finally got to last weekend is Eric Sink advocating code coverage. Code coverage is simply understanding how much of your code is executed within your application. For people like me who start off by sketching, revising, and honing their work, I'm sure an analysis of parts of dead code would be quite revealing.
But there were two other peripheral things about this essay that were very interesting to me. The first was a side comment Eric makes about how many lines of code he's written in the project:
"This library consists of 12,341 lines of algorithms, plus 5,819 lines of unit tests."What's interesting about this to me is that Eric, who is a developer I completely respect, is writing about a line of code in unit tests for every couple of lines he is writing as actual project. Ever since I became the resident nag of unit tests, trying to lead by example, I have come to realize just how much discipline it takes to have serious test coverage. As time has passed I've been happy with our choice since it's been helping us release much steadier versions of our software. I've also learned a lot about how to test our code, which I'll hopefully find time to share on this blog later.
The second thing that is interesting to me is that Eric always seems to have a side project of some kind. As a CEO of what seems to be a successful ISV this is impressive since many people I know in positions like that tend to lose their technical skills as they accumulate the managerial/strategic ones.
}
Saturday, September 23, 2006
Visual Studio Environment Settings
First it was Scott talking about his Visual Studio environment and then it was Jeff posting some of his own settings and a website to download customized VS.NET Environment settings.
I'm usually a bit boring when it comes to things like this - I used to like the courier font at 10 or 8pt since I'm used to laptops with next to nothing in coding real estate. Otherwise everything was default.
But I've taken to Jeff's ZenBurn settings quite a bit.
I hope the IDE Hot or Not site takes off; it would be interesting to see what some other people's settings look like. Who knew Visual Studio could have a Toyota Scion style effect and bring out a person's personality?
}
Tuesday, September 12, 2006
Unit Testing
I've worked on lots of projects but never been in a position to push everyone to have a unit test for all the important pieces of the application.
Pushing for unit tests makes me feel like the resident nag, especially when it goes beyond making the proclaimation that we'll approach the project in this way and leads into my sitting down with people pointing out code that seems to work but isn't covered by any unit tests. I'd be inclined to follow up everyone's code with unit tests they could have written myself, but it's too much work for a single person.
Another difficulty is that while I get the concepts behind unit testing, writing a good unit test is proving more thought provoking and difficult than just the idea of having a test that covers a method call. Most of the articles about unit testing talk about it in terms of methods that don't seem to have as much complexity or methods that don't leverage external resources. It's easy, with articles like that to have an example of a method that adds two numbers and then has a test that asserts that two values added have a correct result.
In our case, we've got a somewhat large database that we are utilizing in most methods making how/what we test for much more tricky. For example, if we have a method:
public LoanApplication GetApplicationById(int appId){ ... }
What's the best way to test it? Thus far we've got the following things:
1. Make sure the result is not null.
2. Compare properties against database query (with a tested database library).
Our test for that method may look like the following:
[TestMethod]
public void TestGetApplicationById(){
AppService appService = new AppService();
Assert.IsNotNull(appService.GetApplicationById(1));
LoanApplication testLoanApp = appService.GetApplicationById(1);
DataTable testTable = db.GetDataTable("select * from App where AppId=1");
Assert.AreEqual(testTable.Rows[0]["AppId"], testLoanApp.AppId);
// other fields test
}
How does one get tests like this right?
}
Monday, September 11, 2006
Testing Frameworks: NUnit up one
After spending a long time without having the ability to impose "testing" in the projects I was working on, I'm now in the position as lead developer to make testing a part of our development process.
Last week I went back and forth with either using NUnit, which I'd be more inclined to do on my own versus Visual Studio Team's built in testing capability. I chose Visual Studio just because it would be easier for team members to get to; I can't look over everyone's shoulder and force them to write tests but I can make it as easy as possible to encourage the behavior.
Before doing so I did a search to try to see if there were major differences between NUnit and Visual Studio's testing - I don't remember anything notable but today, just my luck since we've gone full force in the Visual Studio direction, I find a post complaining of lack of functionality in Visual Studio's test framework vs NUnit.
}
Wednesday, September 06, 2006
Monday, September 04, 2006
REST for the wife
When I was teaching I'd love to ask a person to give me an explanation of a technical concept as though I was a 13 year old. It's easy to memorize the acronyms but it's much harder to unpack them, especially with enough understanding to simplify them for people that have no assumptions with respect to the concept.
Ryan Tomayko, in this case, has done an amazing thing: read along as he explains REST to his wife (who we may assume as an intelligent but non-technical person).
}
Rumble in the Jungle
There is a saying among Africans: "When two elephants fight, it's the grass the suffers most."
But fortunately this doesn't apply to the web; when two giants go at it, we get to tune in and watch the blow for blow, entertained.
On Friday Joel Spolsky published The Language Wars, in which he discussed an approach to picking a language/platform for application development. I believe his point had more to do with picking a well trodden path for a development project, as well as having an architect with lots of experience with your chosen platform/language. Along the way, however, he said:
... and a handful of platforms where The Jury Is Not In, So Why Take The Risk When Your Job Is On The Line? (Ruby on Rails). Before you flame me, Ruby is a beautiful language and I'm sure you can have a lot of fun developing apps it in, and in fact if you want to do something non-mission-critical, I'm sure you'll have a lot of fun, but for Serious Business Stuff you really must recognize...
The rest you can read in the post but these comments sparked a fire from Ruby on Rail's inventor, David Heinemeier Hansson who retorted quickly on his blog that Joel was full of FUD. It's an interesting exchange but Hansson points out that Joel's final thrust is about a language called Wasabi that is used at Fogbugz and completely outside the "well trodden path" or "proven platform" category he seems to espouse at the outset of the article.
Soon after the rebuttle was posted there seemed to be a lot of people who thought Wasabi was a joke that Joel was using to wink at his like-minded classicists with while stoking the fire of the Ruby hipsters - so much so that many posted that they "got the joke" maybe in part to feel like they were the clever Ivy League programmers they assumed Joel left the easter egg for.
But they were wrong, and Joel followed up with a post in which he confirmed the existence of Wasabi, while backing away a bit from controversy by not rebutting the rebuttle.
All in all, it was an interesting friday evening following this story around. I never assumed Wasabi was an inside joke; Joel's mentioned many times that Fog Creek had a compiler they used to generate Fogbugz code in PHP and VBScript amongst other languages. I didn't understand the big fuss on the part of Heinemeier Hansson either and others - the concept of a domain specific language written in something doesn't pull away its platform underpinnings. If anything the platform is a safety net of sorts. But beyond this, the most important piece of the puzzle is Joel's second point: an architect is absolutely necessary for big, enterprise software (in order to do a good job).
On the other hand I find Joel's skepticism toward Ruby on Rails as premature as the blind enthusiasm of many. There is a lot of room between "Serious Business Applications" and college projects. Many business applications are not mission critical banking - I just participated in a rewrite of a sales project management platform that could have been Ruby on Rails fodder. If anything there's going to be better, smarter business development tools as a result of the good ideas that Rails has fostered.
Time to stay tuned to the aftermath in the blog/web world.
}
Tuesday, August 22, 2006
David doesn't get it
David Pogue, tech writer for the New York Times claims (follow up here) that perhaps the reason that there are so many Wintel vs Mac computers in corporate America are because IT folks just want to keep their jobs and the viruses, spyware, and a defective Microsoft operating system help them. A corporate environment with Macs and fewer issues would, according to his logic, result in less work, a smaller budget, and a smaller IT staff.
But Pogue is missing a big aspect of the corporate world: what Visual Basic was historically, and what the .NET Framework is today. Corporate environments are filled with throwaway programs that are very specialized towards people's business needs. Without an environment like that (with serious investment) on Macs, that sort of shift is not possible. It harks back to Balmer's "Developers, Developers, Developers!"
Web applications are removing this disparity between operating systems, but I wonder if Apple sees developers as tightly bound in their corporate strategy as Microsoft does. Because they don't, and don't understand corporate software, it lends itself to the chasm between Apple computer and the business user.
ps. I'm aware of Filemaker and Xcode, I just don't think they are as good. As a thought experiment, compare how much Apple bets on these with how much Microsoft bets on Visual Studio and .NET.
}
Saturday, August 19, 2006
Ruby $LOAD_PATH Watir
On and off I've been messing around trying to get Watir to work on my machine. The gem installed properly based on the instructions given to simple go to the command line and use the following:
gem install watir
But when I tried to execute a simple test I got the following:
uninitialized constant Watir
./watir.rb:6
c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in `require'
C:/CODE06/RubyStart/WatirTest.rb:7
./watir.rb:6: uninitialized constant Watir (NameError)
from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:21:in `require'
from C:/CODE06/RubyStart/WatirTest.rb:7
It seemed like an environment variable was not properly referencing the library but when I hunted for it I saw no environment variables. I ran the unit tests for Watir and it seemed to have installed correctly but I noticed the following at the beginning of each:
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__
Smells like a path the the library so I investigated with:
puts $LOAD_PATH
which shows me the following:
c:/ruby/lib/ruby/site_ruby/1.8
c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt
c:/ruby/lib/ruby/site_ruby
c:/ruby/lib/ruby/1.8
c:/ruby/lib/ruby/1.8/i386-mswin32
In order to get the script working I just hacked the $LOAD_PATH to include a hardcoded reference to my Watir libraries:
$LOAD_PATH.unshift 'c:/ruby/lib/ruby/gems/1.8/gems/watir-1.4.1'
From there I was set with the following simple script:
require 'watir'
include Watir
ie = Watir::IE.new
ie.goto("http://www.t3rse.com")
I'll dig into this - I haven't had the patience to sit down with a Ruby book just yet (anyone have ideas?) but if anyone has a similar problem running Watir, here is a hack to get you started if this is a hit on your Google search.
}
Friday, August 18, 2006
Podcasts to invoke musing, mulling
I love a good podcast. I started as a very regular listener on IT Conversations and have since drifted around looking for quality material. IT Conversations started with a lot of good content but it seems as though of late its drifted into MBA type material which is a bit vague for me; I prefer good technical podcasts.
Some places I've found myself consistently happy:
1. Hanselminutes - great coverage of the .NET universe along with other technical topics such as Syndication, SCRUM, and the like.
2. Software Engineering Radio - I am working at restraining myself of cultural stereotypes but the SE Radio crew are very, very concise. They have a much better depth of coverage than other technical podcasts
3. .NET Rocks - good show with an excellent track record. Sometimes just a touch too long, but I've always liked DNR.
I've listened to a few podcasts from WebDevRadio. Much of what I heard was good, and I like how it takes me out of the exclusively .NET universe a bit.
From IT Conversations, my favorites up to this point included Steve McConnel, Joel Spolsky, Philip Greenspun, Will Wright, and Paul Graham.
Although Venture Voice isn't really that interesting to me, Jason Freid and Joel Spolsky have some good interviews there as well.
In the "lost podcast" genre - David Heinemeier Hansson of 37 Signals had a great talk at Carson Workshops where he talks about the basic philosophy of Ruby on Rails. I don't see a link to it but if you find it, it's good. Simon Incutio took some great notes that will give you a good idea of what was said.
Well, there are a lot of podcasts out there; too many for me to get to. These are most of the ones I keep going back to and finding gems.
Peter Seale has a much more comprehensive listing here. I'm looking forward to going through his list, it would be nice to make a website that kept a nice listing of such podcasts. Not necessarily aggregated, but something maintained by a more trusted curator.
}
Thursday, August 17, 2006
Kiko Lessons
I posted yesterday about the speculation going on about their folding. Here it is from the proverbial horse's mouth.
}
Wednesday, August 16, 2006
Small Teams, Better Software
Via Raganwald, there is a small post on how smaller teams make better software. There is a nice balance between the need for methodology and the idea that people matter most. Agile thinking indeed.
}
Kiko, Down For the Count But...
... will they get up? Buzz is all around since the Y-Combinated Kiko is folding and being auctioned off. I was interested in what looked like a blog post retrospective of the whole thing until I realized it was just someone speculating, not the kids from Kiko writing about what happened.
Truth be told even though web calendars are interesting software, I really don't use them. I used Kiko a few times just to see how it worked and was impressed with what it seemed to take programmatically. And that's how I judge the whole thing - as a technical achievement, not as a sales person's way of making a lot of money even though they may have hoped for that side effect.
Now if I had $50,000 and a lot of motivation I'd get that source code and make a calendar component for .NET - the last one I worked with was no fun at all. And of course I know nothing about being profitable; it would be an interesting project is all.
}
Saturday, August 12, 2006
Yegge's Kingdom of Nouns
I'm late to the party once again; I discovered Steve Yegge just recently and ran across his essay "Execution in the Kingdom of Noungs." Yegge is a great writer and I can see why the essay recieved a lot of attention. Yegge basically asserts that Java is a kingdom of nouns; a language which focuses on things (objects) which he parallels as "nouns" over actions which he parallels as "verbs." This leads to a lot of verbose monstrositities in code and is, in his opinion, a bad thing compared to languages where verbs are parallel or even more first class than nouns - from which we get references to functional languages and the nirvana of LISP.
I remember learning java many years ago coming from the black sheep of all programming languages, Visual Basic. When I got to programming user interfaces with AWT and SWING, I remember being mesmerized by the sheer weight of it. In Visual Basic, one would double click on a button and the tool would create an event procedure that looked like this:
Sub MyButton_Click()
'code here
End Sub
I made the assumption that the tool was abstracting details away for me, but it was simple, intuitive, and effective.
In Java, I learned that to write an event handler I needed to implement an interface with a different class or override a method from an anonymous instance of a class that implemented the event handling interface. At first it seemed cool to throw all the terms around: "listener interface, anonymous instance... " but I had trouble stitching it all together cohesively by hand. It's been a while but I remember liking the idea of keeping a separate class to do my event handling rather than using an anonymous one but running into the trickiness of making references to data in the UI class where the event was being triggered.
I thought this was just a matter of tools; if I got the right IDE I would be able to nail the issue. But the IDEs I used tended to do things differently; I'm digging into memory here but I remember liking Borland's JBuilder for development and disliking how it used Borland helper classes for event handling to try to clean things up.
I think Yegge could have driven his point home about nouns if he'd focused entirely on event handling. To handle an event you need to know about two nouns: the listener interface and the class that implements that interface for you wherein you are given an opportunity to write your code.
I remember getting finally to go to training in Java (after I'd taught myself most of what I'd eventually know) and asking about that. People looked at me with the condescending "complexity is cool" look that usually sends Visual Basic programmers back to their environments to be productive.
And I can see some niceties of the extra nouns in Java. Building even more layers of abstraction is easier (e.g. handling many events with the same class implementing the listener interface) -
It's been a long time but I may be returning to the Java world; I made need to get Java certification for academic reasons. It will be interesting to study the language again with these thoughts in mind.
}
Monday, August 07, 2006
Joel, MapReduce, Javascript Closures, Flanagan
Older news is that Joel posted an excellent essay called Can Your Language Do This? where he walks through some of the basics of passing function references around in Javascript. I'll beat my old drum and say that Javascript is an intricate, powerful language.
The timing for the article is great because I'd just recently used function references as an approach to handling some client side script that needed to be synchronous. In the application we use a popup window that is launched in javascript and then based on some input from the user we pass back information to the page so that it can know how to proceed. The problem with this approach, however, is that a popup window is a disjointed entity from the page it popped up from and the thread that invokes the popup will not wait for the user to close the window before continuing with the rest of the javascript. My solution was simple: pass a callback function to the popup and use that to make sure the user interaction was finished before proceeding with the parent page's code.
Another essay I managed to finish over the weekend that runs along the javascript and functions as datatypes is Javascript Closures For Dummies by Morris Johns. Concise with beautiful typography.
One final thing: David Flanagan has a 5th edition of his Javascript book coming out from O'Reilly this month. I'm excited to see what his treatment of the latest developments such as Ajax will be. It will be painful to be buying that book for the third time, but if I get even a piece of the mileage I got out of the 4th edition, it will be well worth it.
}
Scott Gives Open Source, Step by Step
I've been wanting over the last few days to post Scott Hanselman's step by step tutorial on how to contribute to the DasBlog open source project. This weekend I had a chance to go over it, albeit without duplicating the steps - I'll do that soon enough.
It's always seemed a little sad to me that those of us working primarily with Microsoft development tools aren't as given to collaborating on anything that is either outside the scope of normal work or commercial effort. It's been a goal of mine to contribute to an open source project for a while and it's nice to get this little push in getting that done.
I did download DasBlog around TechEd time to study the structure of the application. It didn't quite install as easily as the *.vbs the readme file discusses but it was a simple permissions issue that I resolved by resetting server extensions on the virtual directory. At the time the NUnit 1.x binary was also unavailable so I had to remove the test projects in order to get it to compile.
Before I start writing patches, however, it will be important for me to have a proper understanding of the application's purpose, design, and implementation. I'm hopeful that my contributions while "dogfooding" will be more meaningful.
}
Wednesday, August 02, 2006
Google Code vs SourceForge
Comparison is made here. The use of Subversion on Google Code makes it appealing to me since I was planning to use Subversion for my home brewed projects anyway.
}
Linus on Visual Basic, Norvig on Javascript, Heinemeier Hansson on taste
Courtesy of John Lam - some of the greater fish in the sea of programming answered some questions on Sztywny Blog:
Sometimes you don't know whether a compliment is a compliment. Linus Torvalds says Visual Basic did more for programming than object orientation.
For example, I personally believe that "Visual Basic" did more for programming than "Object-Oriented Languages" did. Yet people laugh at VB and say it’s a bad language, and they’ve been talking about OO languages for decades.Peter Norvig, yes that Peter Norvig at Google thinks he needs to keep improving his Javascript. It always annoys me when people think they know javascript - not that it's unknowable, but knowing how to do alerts and toggle DIV visibility is for kids.
And no, Visual Basic wasn’t a great language, but I think the easy DB interfaces in VB were fundmantally more important than object orientation is, for example.
David Heinemeier Hansson gives the answers I would expect from him, especially espousing "values" as standing between good and mediocre programmers. For a long time I've been wanting to blog about his talk at Carson Workshops concerning "beautiful code."
The whole round table interview is interesting.
}
Monday, July 31, 2006
Thursday, July 27, 2006
Google Code
Wow, this is an interesting development: Google Code is an online project hosting/collaboration site. I'm sure they wouldn't describe it as an "answer" to Microsoft's own new project hosting/collaboration site, Codeplex, but the timing is interesting. The question that begs itself is "whatever was wrong with our old friend, Sourceforge?"
}
Wednesday, July 26, 2006
Generics + Bad Idea Jeans
I can't get the Bad Idea Jeans SNL sketch out of my head, but I'm not sure I trust myself. At the request of a coworker, I wrote the following to show how a generic Dictionary could be returned from a method with underlying types for key/value stated ahead of time:
public static Dictionary<X, G> BuildDictionary<X, G>(string cmd, string keyColumn, string valColumn) {
Dictionary<X, G> myDictionary = new Dictionary<X, G>();
SqlDataReader rd = new SqlCommand(cmd, GetConnection()).ExecuteReader();
while (rd.Read()) {
myDictionary.Add((X)rd[keyColumn], (G)rd[valColumn]); // ? good idea?
}
rd.Close();
return myDictionary;
}
It leverages generics to define the returned dictionary so that a call could be made like this:
Dictionary<int, int> data = DBDictionary.BuildDictionary<int, int>("myproc", "key", "val");
Perhaps I'm paranoid, or I've been burned too much, or I'm not scared of a little type dynamism, but this seems like a Bad Idea. The big reason, of course, is the casting that goes on in the method:
myDictionary.Add((X)reader["someField"], (G)reader["someField"]);
Reasons for my anxiety?
1. What if the underlying field has a change of type? You won't know until runtime when things blow up.
2. Maintenance if underlying field type does, in fact, change. If being type specific is avoided, you can gracefully accept these changes without a recompile. Even if your lookup (what's in the dictionary) is used, if it's passed to a SqlCommand as a parameter (which is the way I normally do it), the reference it expects is to an object type as in:
SqlParameter para = new SqlParameter("@Foo", objectRef);
3. I'm not afraid of strings. Over time I've been more reluctant to convert things, especially numbers. For example, if a numeric value is passed in the querystring, like:
http://myserv/Page.aspx?custId=101
Why should we convert custId to a numer if it's going to be passed to a parameter (see code above)? Another scenario is when some underlying value is going to end up in a textbox. I do not fear the string, just the Convert.ToXXYYZZ code I'd have to type out if I did want to be "type safe."
But some may feel differently, especially the ones who think that if something in the database changes you may want to intentionally have your code break so that you're aware of it. That's the only idea besides premature optimization that I can use to justify this approach...
}
Powershell Password Gen vs Hobbitwerk:::pwd
Scott Hanselman just posted an example of a password generator in powershell. Very cool, and reminding me of Hobbitwerk:::pwd. His script, however, is 7 lines of clean code.
Speaking of Hobbitwerk:::pwd, I'm surprised by how useful it's become not only for myself but for a lot of the people I showed it to. It's nice when a guy who's used to writing Me-ware makes something that other people leverage too.
}
Tuesday, July 25, 2006
Reddit Expansion
I'm cheering for Paul Graham's Reddit minions. The Reddit concept is brilliant, and now it's spawning into some really interesting variations (have I got them all?):
All of which are now subscribed now on my aggregator. It would be interesting to see the original Reddit code, which was written in LISP.
}
Jean Paul Understands
After listening to the .NET Rocks podcast he was on covering Test Driven Development, I glanced at his blog and saw this post/rant against declarative databinding. Since the Visual Basic 5 Form Data Wizard, a lot of this automated stuff has remained beyond my liking. Well, actually that VB 5 Form Data wizard did work out really well once: I had a meeting with a client and nothing to show so it bailed me out that time...
Here are my big problems with declarative databinding:
1. When does it happen?
I have no idea based on the demos. You set things up at design time and run the app after which you're supposed to smile and think that it's cool, but databinding for me in the "real world" never seems to happen that way. Sometimes binding is conditional or based on circumstances that can only be evaluated programmatically. Not only that, but sometimes I'm binding many many things (think 10 dropdown lists) and don't want a data source control for each one.
2. Embed SQL statements in the ASP.NET Page?
Never, ever, ever. Usually stuff like this is tucked in the business layer with a stored procedure. I like the idea of object data sources, but it seems like a lot of work for the small stuff, like lookup values.
3. It's never that simple.
Like the last project I worked on, in which some fields displayed in a grid were too long, so I had to iterate bound data and make tooltips. Or the column that's an encoded link based on some data outside of the grid. Or the column that displays various images based on some criteria (think: sometimes a PDF icon, sometimes a Word doc icon, and so on).
Don't get me wrong at all: databinding is good and I use it every day. Declarative databinding, however, has never proved useful to me.
}
Say Hello
bdos equ 0005H ; BDOS entry point
start: mvi c,9 ; BDOS function: output string
lxi d,msg$ ; address of msg
call bdos
ret ; return to CCP
msg$: db 'Hello, world!$'
end start
Oh, that's just me saying "Hello World" in assembler. There's a massive list of the program to begin programs over at Wikipedia.
}
Love For Apple
Leander Kahney gushes about the little things that are so well designed in Mac software. I agree in the sense that it's small things you'd have never thought of that clinch software. I disagree that this can be applied to all Mac software; I am just now coming back from a session with ProTools, powerful software to be sure, but filled with lots of hidden menus, features, and quirks.
Nothing makes me happy like good software, especially in the moments when it's obvious that something I want to do has really had some thought applied to it. Printing in gmail, for example. Multiple tabs in Firefox. The ! shortcuts for searching in yahoo. iTunes burning an audio file that's too big across multiple CDs. Oh, and the smart playlists on iTunes too. I should make a list someday...
}
Monday, July 24, 2006
The Design of Data
First spotted on the Scott Guthrie blog, there's a library of database schema models here. The world owes you, Barry Williams.
Of course, most of the schemas are more like design sketches; I seem to live in a world where strange business rules seem to retard any design of elegance when it comes to data.
}
Sunday, July 23, 2006
Java Weekend
The secret's already been partially out that I'm attempting to return to school to study Computer Science. Part of the requirements for the school I'm trying to attend is a program of some sort written in Java along with a personal statement. I submitted a ported variation of a program I wrote a while back in C# as a response to this blog entry. My program applies a Haar transform on an image file.
It's been a while since I've used Java. I downloaded and used Eclipse as my IDE, and that was a great experience - I'm curious to know if the GUI development parts of Eclipse are well developed.
Working in Java, after all this time in C#, was a bit strange. There are the small arbitrary things, like camelCase for methods rather than PascalCase, and then there are the bigger things, like doing type conversion (in .NET I just use Convert.ToXXYYZZ (e.g. Convert.ToInt32, Convert.ToDouble, and so on... )), and then there are the massive things like trying to emit an image file to disk. In C# this is very trivial. In Java, it's painful enough that doing a search on Google will yield all kinds of Bitmap implementations that people have written to make up for a lack of support in the language.
Speaking of which, the program took about 2 hours to port but for these lines:
File output = new File(filePath);
ImageIO.write(myBufferedImage,"bmp", output);
The kept succeeding only in writing an empty bmp file. I didn't stop to figure out the debugger in Eclipse (wouldn't have mattered if I did), but couldn't for the life of me get to the root of the issue.
I used to think Javadoc comments were such a beautiful thing until I began searching Google for ImageIO.write examples. Apparently everyone has taken it upon themselves to have a copy of the Javadoc online with redundant information. And the Javadoc itself has no clear information about the method either, especially for cases like mine where it succeeds, over and over again, at creating nothing. (Why not use an enumerated type for the format parameter of the write method if it's going to be limited?)
After a few hours I'm at the video game point of debugging (just trying different things) and ran it with the following:
File output = new File(filePath);
ImageIO.write(myBufferedImage,"jpg", output);
Lo and behold, a file is created on my machine. And it sort of clears up for me that the write method's format is limited out of the box ( I think, but did not confirm) to jpg / gif / png formats. I'm guessing at a disdain for "bmp" as a Windows specific format or something of that nature pushing ImageIO to exclude it in its base support. Although there may be ways around this (I saw a class called ImageWriter which may have had those capabilities) it makes me really wonder.
I think it also shows a difference between Microsoft and other companies. At Microsoft, they'll spend extraordinary efforts for a guy like me on a weekend like this to be able to write:
Bitmap bmp = new Bitmap();
// do stuff
bmp.Save("pathToFile.bmp");
We could all write our own implementations of a Bitmap helper class, but IMHO, I'd rather be thinking about other things like perfecting the transform.
}
Wednesday, July 19, 2006
Monad vs. Unix Grey Beards
An interesting post from the Monad folks (make sure you read the comments) on a look at syntactical differences between Monad vs. Korn Shell.
}
Agile Perlcast
The latest Perlcast features Andy Hunt, one of the Pragmatic Programmers, talking about Agile Programming. Although my use of perl in a professional context is limited, Perlcast is one of my favorite developer podcasts in no small part to its host, Josh McAdams -
The following are discussed:
1. Pair programming
Andy gives an analogy of a driver and navigator. Interesting, but I have to admit the whole pair thing has never quite had appeal for me. At least, not as the "navigator."
2. Learning sessions
Andy recommends company learning sessions in the middle of the week (my own company does it on Friday). It's a good idea since the beginning of the week is catch up usually, and by the end a lot of people have checked out. I do like the fact that on Friday, however, there is a bit more of a relaxed atmosphere in the office, making the learning sessions double as a sort of group bonding where the developers can hang out and not feel too much stress.
3. On keeping up with what's current
Focus on awareness, not necessarily depth. It's impossible to know about absolutely everything going on, but keep your radar going and understand the big picture meaning of what's new. Easily said, but I will admit to frequent moments like today: feeling utterly overwhelmed by the amount of useful information that's out there. And no time to process the little I get a handle on from time to time.
4. Estimation
Andy's gotten companies to go with incremental estimates of time for projects. This is a great idea, but as Andy seemed to concede, it's sometimes hard to get a client to look at things that way. Because budgeting for a project is usually based on a proposal, and the proposal must take into account the entire scope of work, I wonder at a good angle from which to introduce this... maybe with shorter cycles up front. Unfortunately, the beginning of a project is usually a lot of design work and may not involve a ton of demonstrated progress. Hm...
5. Testing
Wow - this was the best part of the podcast. Andy goes through a bunch of acronyms to use to remember the different ways to approach unit testing. I'm not usually one for acronyms, but in this case I think it can't hurt. He recommends as much test code as production code... a really tough sell since I don't think any of the clients I've worked with run numbers on bug fixing costs. Because of that what's important to budget both time and financially is the "development" cycle and whatever is left over before the magic deadline must be applied to bugs.
But here's where I take it: the half/half production/test code thing is about the effort a developer makes to test and have automated unit tests available for their code. And, from a guy who's spent the last many days almost exclusively fixing bugs, I'd rather invest in test cases than bug fixes. I'll have to strategize on having lots of shiny things to throw at the client in order to demonstrate progress but somehow pace development so that much more is invested in unit testing.
6. SCRUM
Andy finishes with some talk about SCRUM as a lightweight development process. I'll have to read into that a bit; it seems to formalize some of the things that I've done in the past but it seems like a magical ideal that is very difficult to be disciplined with in real life. For example, quick meetings at the beginning of each day tend to expand in the amount of time they take. A lot of the time, if there's something that is really involved (like it's going to take a few days or weeks to develop) I prefer to just get to work and get into my code since mornings are one of the more productive times of day for me.
One thing we've done on my current project is have an email sent out that lists what everyone is working on, seems like a good compromise.
7. Write readable code
'nuff said.
8. Some OO design commentary, bleeds into contracts, encapsulation.
9. Architects should code.
I think Joel said it all when he wrote about Architecture Astronauts. Another funny article I recently refound online a humorous essay about UML Fever.
}
Monday, July 17, 2006
Monad
The most recent Hanselminutes podcast is the second in discussing MONAD, or the new windows command shell. I decided to listen to the first one, published in late March during the commute and got my quote of the day:
Scott:
"comparing Monad to ... bash or any of the Unix shells is the difference between shooting a bullet and throwing it."
Tomorrow I'll listen to part two.
}
Enterprise Architect (Sparx Systems)
I'm not one for exhibit halls; even the "swag" is sometimes not worth having to talk to the sales people. At TechEd, I did happen upon the Sparx Systems booth and after a brief exchange with the Australian guy who was manning the booth and who was definitely a developer (takes one to know one), I became interested in their Enterprise Architect software.
UML modelling for $200? Most of the tools I know of are the Rational "don't even bother if you're not a large government" scale. It supports code generation for many languages: Java, Python, PHP, Delphi, as well as the Microsoft staples, C++, C#, and VB.NET. Wow, now I'm really interested. More? It generates Xml Schema as well.
It's all really interesting since certain people (who I'll avoid mentioning on the blog since it will sound redundant) have me really interested in Model Driven Architecture and the idea of modelling and coming up with contracts and then generating code.
I am using the trial version now (arg! I installed it a few weeks ago but only started using it seriously over the weekend which gives me 10 more days left to work with it) and find myself really comfortable with the interface and functionality. I used the documentation to see how enumerations worked and that was a snap. I generated C# code which worked quite well.
The last thing I did was to post on Joel on Software to see if anyone had had any bad experiences and it seemed like everyone said nice things.
Now I am working up the courage to ask the boss to buy it. I can anticipate two questions:
1. Why not Visio?
me: not as light weight, code generation is a bit clunky, adding new types doesn't work as well, not as many diagrams supported, no XML Schema generation support that I know of...
2. Why not Class Diagrams in Visual Studio 2005?
me: Even more light weight than Visio.
Update: I am now a licensee of Enterprise Architect. Life is good!
}
Sunday, July 16, 2006
Perl is dying
According to this article from "Anonymous Monk." I'd remain anonymous too if I made the claim since people tend to get passionate when it comes to Perl.
My personal reaction is this: I like Perl, and I'd love to use it more, but I've only experienced evidence that supports his arguments as I've been dinking around in Perl over the last few years.
Update: Interestingly enough, the direct link is now dishing out 403 errors. I doubt the perl community would actively censor anything so I'll assume it's a glitch with the url I used. But, as the Keymaker says: "Always another way..."
}
Saturday, July 15, 2006
Grok the Functional
"Functional Programming" is a term I've been long accustomed to hearing and generalizing about, but whoever is at the end of defmarco has done a great job in this essay of unpacking the basics of Functional Programming for those of us who never encountered it in an academic setting. I found it referenced via John Lam.
The essay sweeps through the logic and ideas of Plato, the geniuses at Princeton who started thinking in lambda expressions, and John McCarthy's innovation at MIT of LISP. From there a case is made for the benefits of Functional Programming along the following lines:
1. Unit Testing
2. Debugging
3. Concurrency
4. Hot Code Deployment
5. Machine Assisted Proofs and Optimizations
The latter part of the essay is defmarco explaining the basics of Functional Programming. Even though the essay is "for the rest of us" I admit that the differing style from what I'm used to in impatrive style did require frequent stopping and mulling. But it's well written and very accessible in its explanation of some of the fundamentals:
1. High Order Functions - functions operating on other functions
2. Currying - reusing functions by assignment
3. Lazy Evaluation - evaluation as needed
4. Infinite Data Structures - based on functions
5. Continuations - like the stack, but oh so powerful
6. Pattern Matching - functions match calls based on parameter values matching
7. Closures - state management function to function
Great essay, well worth the time and effort.
}
Wednesday, July 12, 2006
?? Operator - I'm late to the party
I shouldn't have glossed over those "new features" ReadMe files for .NET 2.0. Today I found the ?? operator which is probably going to get me into even more trouble than my use of ?: with other developers.
In short, you can test for a null and return an alternative like so:
string test = (myObject ?? "");
Fritz Onion posted about its use with the ViewState some months ago. I'm sorry I missed it then...
}
Does Scott Hanselman Sleep?
His level of productivity is frightening; every time I try to relax and watch TV I get a mental picture of him furiously spitting code, or working on his next book, or presentation, or whatever. But he exposes at least one secret an online presentation: know your tools and customize to avoid wasting time.
This presentation is about tools to enhance developer productivity.
On his site he's got a great list here.
I wonder if anyone has documented the old DOS commands / techniques for those of us whose digital life was born in the Windows era. I'll have to look around -
}
Tuesday, July 11, 2006
Saturday, July 08, 2006
Martin Fowler at RailsConf 2006
You can watch the entire keynote here, many a good thought. Some interesting thoughts:
1. Ruby on Rails, as an opinionated framework with limited focus is good.
2. Fast development cycles are good, better than Big Design Up Front.
3. People think in the mistaken trade off of quick & dirty (VB, PHP) and "enterprise." Just because something was done quickly doesn't mean it's dirty.
4. Keep programmers and customers in close quarters, combine with quick release cycles and allow for observation of how software is used. (I love this idea, I learn *so* much when I watch people use the software I've written for them).
5. Disdain for libraries (and I read along with that unnecessary abstraction) with several jokes about java.util.Calendar
6. Ruby the language is essential for Rails.
7. Postmodern Programming: embrace inconsistencies, cobbled together world and realize software is the same way giving the example of Unix.
I found myself agreeing with Martin, blow for blow most of the time.
}
Meeting Sahil and Ambrose, Becoming Famous
The Saturday night before TechEd I noticed a gathering online - the "Party with Palermo" - organized by C# MVP Jeffrey Palermo. This was courtesy of Google so I didn't have a personal connection with any of the players there other than knowing they were some of the higher profile attendees.
The first person I got to meet was Sahil Malik; I have his ADO.NET 2.0 book from Apress but didn't make the connection at the time. I wish I had although it's probably a good thing since I'd have pestered him with more than a few questions. But Sahil did the courtesy of talking to me a little bit about Concurrency - expanding the notion in my mind from just database locking mechanisms and settings to the statefulness of objects and their interaction in the .NET Framework. Sahil was very courteous.
After Sahil excused himself I noticed a guy wearing an Infragistics shirt and, completely forgetting myself, pounced upon my opportunity to dialogue with a representative of a company I've blessed and cursed in the same breath.
Almost forgetting to introduce myself I began firing off comments - the shortened version of which is that Infragistics makes powerful stuff but leaves gaps in documentation, and that the dark, voodoo magic that is left on an ASP.NET page in the form of cryptic javascript is quite disconcerting - perhaps before I learned that I had met Ambrose Little, another C# MVP who had only just started at Infragistics as a technical evangelist of sorts.
Ambrose played it well, allowing me to get my frustrations off my chest asking questions like "what do you think we can do better?", and then pausing for my excited bursts of opinion. My excited babble only continued when I discovered he was presenting on the Microsoft Enterprise Library. I asked him what he thought of it, really, as a very large layer of abstraction of other libraries (which themselves are layers of abstraction), and he gave a neutral response along the lines of it depending on the developer and their approach. I've met many people and I've got to think hard of a person who was able to deftly answer questions while choosing not to really commit a strong opinion, as well as steer an encounter like ours into therapeutic venting rather than debate or contention. I didn't go to his session about the the Enterprise Library but I'm really looking forward to the TechEd DVD when I can get a real sense of his thoughts and what he presented upon.
During my excited conversation I noticed a picture taker and now these moments are recorded for posterity on an offshoot of the Atlanta .NET Regular Guys website. They were taken by Heidi Schwartz whose husband Brendon is a developer actively involved in the INETA organization.
Sahil's blog is here, Ambrose writes a blog here, and Brendon contributes to a blog here.
}
Thursday, July 06, 2006
TDD is like flossing
Everyone knows they should be flossing as well as writing their tests first. They've heard of the tools like NUnit, but they just don't do it. Take it from a guy who got drilled for several hours recently because of cavities between the teeth: it's not worth it.
On a serious note, I'm spending most of my time in my current project on bug fixing. I know that leveraging unit tests and a tool like NUnit will not only make me more productive, but also trim the amount of time I spend like today fixing bugs (all day long).
The big question is how to apply that to a web application. Many of the examples given for tests in NUnit really lend themselves to libraries (DLLs) and not to Web Forms with postback cycles.
I haven't had much time to dig into it, but pretty soon I'll have to roll up my sleeves and do a comparison of the new Visual Studio Team System test capabilities and NUnit. The NUnit people blogged a comparison but I'd like to have a look for myself. My leanings would probably be toward NUnit for simplicity, less overhead, and availability, but I'll withhold judgement until I've had a chance to get dirty.
}
