November 30, 2007
@ 07:22 AM

Spec# Programming

The first 10 minutes of this presentation were kind of rough. It was a little bad-geeky, and I thought it was going to one of those sessions where the presenter assumes the audience shares opinions that they don't have. Have you ever been in a situation like that?

Anyway, it turned around rapidly, and the last 60% was really good and informative. Too bad spec# seems so far away.

.NET Software Development Framework with TS

I felt that it would be a good idea to attend this, as my boss is hot on getting our team using TS with some kind of massive reporting/"agile"/addin thing that costs a lot of money. In case that last sentence wasn't obvious enough, let's just say that I treat the arrival of TS in my work life with great trepidation.

The presentation was good, but key pieces of data for me were:

  • The models that Mario described seemed to have very little to do with Team System. You could do that for any set of tools.
  • There was a lot of emphasis placed on the ability to handle/manage/deal-with what I would call "sub-optimal teams." Where I work now, I think is very similar to the environment Mario described: consultants in and out, ridiculously slow feedback loops with IT/infrastructure org, wide range of skillsets in teams. I think a lot of management where I work would totally buy what Mario sells. Seriously, he should call someone I don't know at my company, that decides these things. I would much rather work with someone like this than whoever they hired this week to (pretend to) do this kind of work. I just think that this is the wrong direction to attack this problem from. Inevitably, it's the direction we will probably take.
  • It's good to know there is a 496-pager about how to do team development with TFS.
  • It would be a good career move to learn this stuff.
  • If my current future career path involves this stuff, I think it's time for me to investigate pig farming, because this is not my beautiful house.

The whole "tools that generate reports and stuff are for managers" from the Agile Q&A session speaks more to me. I am more interested in getting closer to the business problem domain than wallowing in _our_ problem domain. I only want tools that help me _do_ work, not tools that help me do more work.

Queuing and Caching to Scalability

There were a lot of people I heard at this conference that seemed to come from Edmonton. Edmug. These guys had it going on. They were like a gang or something. I think it's cool when a bunch of people who share a common interest get so enthusiastic about it. I think James is kind of like a thought leader there or something. He seemed really smart and made me want to move to Edmonton. I wonder if I could get a work permit. Do they let illegal aliens work in Canada?

Somehow, I was actually a little surprised to see James presenting on this topic. It wasn't really an agile thing, or some cool web 2.0 thing, or an "ALT" thing, or anything like that. It was just straight up good architectural/technology advice.

One of my notes was that this is a good talk for all ages crowds - developer's of any level could benefit from a talk like this. What I liked most was that he was basically telling people to think, and not just dispensing "best practices."

James has a weblog. Subscribed.

Fundamentals of Domain Driven Design

If I had to pick one, this might be my favorite session. This one or Jeremy's winforms one. It wasn't so much that I got a lot of new information here - preaching to the choir again - but it's really useful to talk about this stuff with other people doing it. That's what I was hoping to do with my book club idea earlier this year, but that never took off. First they laughed and compared me to Oprah for wanting to do a book club. Then the QA guys and my boss stole the idea and tried to do it themselves. Sniff...sniff...

So since no one else at my work (except Michael) want to talk about DDD, it was really nice to be in this talk, and also the impromptu discussion we had in the hall, with Oren, John Vanspronssen, and another guy that works with John at MDA. I wish we could have like 4 hours of that kind of stuff. Like a birds of feather or something.

There was a fire alarm towards the end of the session, just when things were getting really interesting and we had the basics out of the way.

I can't really do justice to this talk here. I will probably be posting more about some thoughts I had later.

One funny thought I had, though: John called David out on the idea of the "world model" and how DDD isn't a world model but a _domain_ model. Slip of the tongue in a world...oops...a domain of overloaded terms. But when David mentioned building systems of interconnected domain models, I immediately thought of this Royksopp video, which shows many domain models interacting.

More later...

There were 2 more sessions I attended, but I have to go to work, and I want to post this now so it doesn't become another neglected post in my drafts folder. 


 
Categories:

November 30, 2007
@ 07:10 AM

I ended up only being able to go to 2 days of this, but it was worth it. DevTeach seems to be like a halfway point between a code camp and a big conference, in that there was a lot more "user generated content" than you would see at a big conference, but they still had there shit together...except for the hotel - that place was falling apart. Nice hotel, but they messed up so many things...late lunches...a fire alarm in the middle of one of my favorite sessions...etc.

Anyway, here are some notes/overview of a few of the sessions I went to:

Oren's Monorail Session

I missed the first 40 minutes of this because I was stuck in traffic (I drove up from Seattle that morning.) I am not using monorail on any of my production apps (yet) but do steal code and ideas from monorail, igloo, and Oren's other stuff.

Next week, I am going to spend more time learning how [ARDataBind], [ARFetch], and the JSON Binder work, so I can either steal it or just finally give up and convert one of my applications to monorail (mmm...after this release maybe.) I am so close now as it is, since the application is basically  javascript views with [ScriptService] proxies to communicate with presenters.

Jeremy's Maintainable Software Ecosystem Session

This was pretty good and prompted a lot of internal questions for me / really got my brain juices flowing. One choice quote I heard from a developer in the back, talking about why it was tough to get (outsourced) operations people to play, "CGI is everywhere in Canada." I hear you brother. CGI isn't bad. It's the whole concept of remoting something that should be in-process that's broken.

Something we can do: for legacy projects, at _least_ get them to build. So far, I have been focusing on trying to convince people to cover their "maintenance" with unit tests, with ho hum success. Maybe getting stuff building is a better approach, especially now that I have CI Factory in the tool belt.

The main problem: installers. Not relishing the idea of helping people make a bunch of Wix scripts to build their installers (for 39 projects my business unit owns.)

Maybe: screw it, just use devenv on the build server to build the install packages?

Maybe: just automated build, smoke test, then manual installer build when you want to move to QA (far less frequently than you check in and cause a build (yeah...actually that's another thing to work on...getting people not to sit on dirty code for weeks at a time!))

Also, one conflict I heard: Check in frequently vs. Don't check in when the build's broke. For my money, having the flight recorder running (code checked in) is more valuable than having code that builds. If the plane can't leave the runway because a tire's blown, let's not ground all the other planes...wait...bad analogy. We're not all in separate planes. If the build is broke, _we_ should just fix that shit. I am not into the blame thing. I was really happy to hear other people voice this opinion as well - who needs the whole dunce cap / buy donuts thing in this day and age. I would much rather see people check in broke code than sit on changes for a week because they don't want to fund a group starbuck's run. But that's just my world. We had a guy sit on changes for 7 months without checking them in. I am being reactionary.

Other important gems:

  • Spread the knowledge: For me, this means, make sure everybody knows how to use CI Factory and other tools to make our software, or at least enough to maintain their own stuff. Don't let there be "the build guy" whose vacations cause chaos.
  • Maybe we can just use Rails Migrations: Why not? It's easier than change scripts. We're not ruby programmers, you say? Migrations isn't about ruby programming, it's a DSL. Something to chew on. Someone said Ruby people were moving away from migrations, but it wasn't back to change scripts, so migrations would still be an improvement to what we're doing now.
  • "Practice Like You Play": Boy is that ever good advice. I think I'm going to be saying that a lot now.
  • Use no touch deployment when you can: For me, this is a slight conflict with "Practice Like You Play." As it stands, we need to deliver MSIs for deployment to production. But that doesn't mean we can't do builds+smoke with no touch. The idea that the build/test machines are polluted with a bunch of MSI stuff really sounds good anyway. Most people don't realize all the side effects of installing / uninstalling MSIs and components inside of them. (remember the time someone "accidentally" uninstalled msxml4?)
  • Environment Tests: This is a really cool idea...and spawned some interesting on the fly development.
  • Fast Build, Slow Build: Need to push this idea before people start writing mad unit tests for legacy code that call stored procs, where I work. Those can go in the slow build, thank you very much. Need to look at modifying CI Factory build scripts for this before CI Factorying more of our projects.
  • Build Queues: In latest cc.net. Kind of good to know.

Oren's Rhino Mocks Session

This was kind of preaching to the choir a little bit for me. One thing I learned: MockRepository.Stub<>. Didn't even know that existed. Have to check out later.

I went to this session more to see how other people react, what questions they had, or to hear stories of people using RM. For this the session was very useful to me.

Lunch, Day 1

Lunch was served wayyy late. Rod Paddock, whose blog I read, and whom I've seen around at code camps and stuff (and who lives nearby, too!), was kind enough to let me hang out at his table for lunch. Later, Cathi Gero, Markus Egger, Julie Lerman, Ken Levy, and several other people came. It was cool to listen to these guys talk about what they were doing etc. Lunch was served like 1/2 hour late or something. There were lots of choices: Salmon...and abstract, virtual, throw new NotImplementedException(), vegetarian food, as Ken found out when he tried to opt out of the salmon.

Agile Q&A With David Laribee and Friends

This was a very Open Space style session, with the 5 chairs at the front and all. I wanted to share about "Intern Day" and "Pimp My Code", but by the time I thought of it, there was a lot of other talk. We had trouble staying on course. We only got through a couple of the things we set out to, but it was still pretty neato.

One takeaway: tools that generate reports and stuff are for managers. Manager's jobs are to insulate us from that kind of stuff. And, "everything wrong with a company is management's fault"...coming from a manager! (are they hiring? Yes! Too bad they're in Texas)

Jeremy's Design Patterns for Maintainable Winforms

Another great session. Somehow, the only note I managed to jot down was that I need to check out the microcontroller stuff in Jeremy's final roll your own cab series (oh, heck, here's the link.) There is a metric crapload of really cool stuff on Jeremy's blog and I have just lost the ability to digest it all with the amount of work I have right now. I am going to have to go back and read a lot of stuff when I have time. Maybe I will take a vacation just to read Jeremy's blog (we have use it or lose it style vacation time, it's December, and I've got about 2 weeks worth of vacation time I lose on Dec 31.)

Left Early

My brain was full and I had gotten up at 2am so I could be late to Oren's first presentation. I did manage to make it back for the taping of .NET Rocks, after checking into the hotel, ditching my bags, and taking a shower.

Somehow, I always imagined those .NET Rocks live shows in kind of a darker, rock show with lighting kind of environment, instead of the bright full lighting in the place we were. Not relevant, but kind of an interesting imagination meets reality lesson (for me anyway.)

Richard told the funniest geek story of all time. It reminded me of the time my buddy Sam and I actually heard our local phone office switch over to a 5ESS switch (we were on the phone at the time) and went down to the phone office the next night to dumpster dive the old 4ESS switch and haul it back to his barn. Richard's story was funnier.

The show was pretty good.


 
Categories:

November 19, 2007
@ 06:43 PM

This was such an awesome "Taiwan Picture of the Day" (the things that show up on the upper right corner of my weblog website) that I had to save a link to it here. I love cloud pictures like this.

Since I don't post very much, this post will probably stay here for a month, hence the title ;-)


 
Categories:

image

I really like the Code Rush dynamic type stuff, introduced with version 2, but I never really understood how it worked until this week.

I often find that I use the "pl." family of templates and then go back to change the List<> to an IList<>. I got tired of this, so decided to see if there was a way I could add IList<> as a mnemonic somehow.

After checking out the "p?Generic1Type?" template, and reading the description, I saw somewhere that it read the list of type mnemonics from a dynamic list. I then found this forum post, where Marc Miller explains where to find the list.

So I added "il" as a mnemonic for "IList". Now I can type "pil." and get an IList<> property, or "mil." and get an IList<> returning method, or "pild8" and get an IList<DateTime> property.

The only tricky part was figuring out how this Dynamic Lists dialog works. The add button is disabled. After staring at it for 5 minutes, trying to figure out how to enable it, I tried changing the mnemonic of an existing one, and suddenly add was enabled.


 
Categories: CodeRush

November 8, 2007
@ 06:26 AM

I totally don't get twitter. It sounds sooo dumb. But I've been trying it out for a couple of days and am starting to like it. It seems like kind of a happy medium between instant messaging and blogging. Kind of like multi-cast, one-way, instant messaging. No long articles, so I don't mind getting alerted (by my IM client) that someone I am following just posted something.

It works really well from my phone...not texting (not part of my plan) but m.twitter.com works great on my mobile browser. I even posted from the car yesterday - not driving of course...well, sort of driving...it was a red light. That's not a crime is it?

I am on the lookout for a really good client for the dash or other smartphone. The API looks really simple, so I could build one if I was sufficiently motivated. I want something that polls (so I don't need to run an IM client), notifies, and let's me post over http. Maybe just mailto my dasBlog weblog is better? Then I could post pictures and recordings even.

On parenthacks recently, they talked about using twitter to record stuff about babies. That's what got me interested in this. Julie did an amazing job at keeping scrapbooks for the first 5 years of Allie's life and is fond of saying that I'm next up to bat. She's set an awfully high bar, so I am going to need all the assistance I can get from my good friend technology. I can see me 1 year from now, chasing a baby around with my dash trying to catch first words or steps and posting them somewhere for posterity and sharing.

Nobody reads my twitter. If you've ever had an IM conversation with me before, or are really, really bored (I am a pretty boring person) you can follow my twitter feed at http://twitter.com/cbilson (there's a link over there on the left of this blog somewhere too.) I will try and twitter anything of interest that happens to me, while staying out of trouble.


 
Categories:

November 8, 2007
@ 06:03 AM

Recently, at work, we started a program called, "Pimp My Code." I am not sure where the idea came from exactly, but it was brewing in my head for a little while, and it all came together in a staff meeting, and I kind of blurted it out. The main things, for me, were:

  • to get away from "I'll get back to you later" style code-reviews, which don't seem very effective
  • get more people owning code - we have a lot of legacy code owned by < 1 person
  • help people get used to refactoring and TDD, ++adoption
  • show people how to start refactoring and writing tests for a legacy app
  • But...be less prescriptive and more generative. Code reviews are dreaded for their prescriptiveness. I want PMCs (the SFW TLA for Pimp My Code) to be something that helps the code under test, not criticizes it.

I think I should give credit to Jim Little, who mentioned that they do some kind of "mass code review" or something at SNSC (see comments here.) I think they were planning it last time he mentioned it. I wonder how it turned out?

Today is pimp my code #2. The first one went pretty well, so the challenge will be to keep up the pace and switch from me typing and talking to someone else typing and everyone talking. Michael had a lot of good input last time, and this time Fred (Hirschfeld) will be there too, so I expect even more input. Also this time, we're going to work on code I used to own(past tense after PMC.) I am guaranteed to walk away smiling!


 
Categories:

November 8, 2007
@ 04:16 AM

I wish I was there. The next best thing is reading Travis Illig's summary posts. The day 2 post has many things that I'm sort of interested in:

  • Agile isn't cookie cutter - you still have to think (Steve McConnell and Peter Provost)
  • Team system will get better
  • Jim Newkirk - lots of interesting things:
    •  Keeping tests close? I just finished getting over that and keep my tests separate now! The way I used to do it was less elegant, using "#if (UNIT_TESTS) ... #endif" but was supported by VS.
    • Small fixtures: Aren't most unit test classes screaming for separation of concerns? Why are all these barely related [Tests]s sharing a [SetUp]? If the arrange part of 3A leads to duplication, why not handle this the way we handle other duplication in code: extract method.
    • Just do it! The team I am on now suffers from this. We talk to much but don't do enough. You need to walk the walk.
    • Small fixtures: I am guilty of violating this one. It's the separation of concerns thing. I think I would be better if I had one test fixture per feature instead of clinging to the one fixture per class under test model I have now. Test fixtures are more "separation of concern" sensitive than classes under test, since they typically need more methods to cover all the requirements of the class under test.
    • I wonder if Jim Newkirk could be convinced to present something at Seattle code camp...if that ever happens!

If Travis is looking for "speaking gigs", Seattle Code Camp is coming up, and there are a lot of user groups here in Warshington that you could check with. Hope to see him speak some time.


 
Categories:

November 7, 2007
@ 08:59 PM

There are some people in life that I feel not worthy of having had the chance to meet.

When I was 18, a scared kid who had just arrived in Taiwan looking to make a living, I ended up staying in a hostel dorm with Martin Lueders and his wife Jen. Jen was pregnant, and they were kind of heading home to Scotland (where Jen is from) after traveling around India.

Right away, you could tell this guy knew _stuff_. He had some kind of magic aura about him. You just wanted to do good by him. He had strong opinions about the world and you just kind of wanted to agree with him, even if you didn't. He was older than me and gave me lots of valuable advice, most of which I didn't take advantage of right away...except for reading Dave Barry and listening to Elvis Costello.

I moved out of the dorm a month or so later. I saw Marty and Jen around a couple of times. I wished I had more time to just hang around with them. They left and every once in a while I'd meet someone out of the blue that would have some snippet of news about them:

"American Marty? Oh, hell yeah! I just talked to him about 2 weeks ago. Met him on a bus from Glasgow to London. Coolest guy! He gave me all kinds of advice about where to stay and how to get work here in Taiwan. Hell, he's the reason I am here!"

Someday I hope to have a chance to meet up with him again. In the meantime, I can only marvel at the incredibly moving and amazing work he has done.


 
Categories:

November 7, 2007
@ 08:35 PM

Since learning about how Radiohead did this, I have been thinking about this alot. Would this model work for software? If you had to pay _something_ would you just pay $20? $40? $1? There are a lot of little utilities I use that I can see paying $20 for.

$20 is the magic number. If it's just a donate button, I'll probably pass. Honestly. Who wants the extra work of pulling out the card and filling out a form. Not me. Better things to do. If it was just part of the process though, and especially if it used something like amazon.com, where I don't have to fill out any forms and they already know me, then that's just part of the price and I'll gladly pay $20 if it's something I want.


 
Categories:

November 7, 2007
@ 05:41 AM
DSCN4979

When you read this (assuming you've already read it and it's had an effect on you...if not, read it now, wait 6 months, and come back here and read this,) did it alter your behavior?

Away, if we start by assuming my home page is http://www.hanselman.com/blog/ and that includes the trailing slash. We know that if my browser requests http://www.hanselman.com/blog without the slash, it'll be told by the Web Server to try it again anyway, which is just wasteful.

Calling out this fact kicked in my recessive OCD gene. That's the same gene that causes me to type "dbo." before stored procedure names in SQL server, because I know if I don't, SQL server is probably going to look for the procedure in the wrong place first, which is just wasteful.

Scott is the same guy that "saved me a few hundred 'otepad's' a day," which I guess kind of makes up for the fact that pointing out the above fact costs me dozens of slashes a day...even if mobile phone slashes are almost as expensive as desktop otepads.


 
Categories:

November 5, 2007
@ 12:28 PM

This is just a "pay double and get one free" (plus wifi access, I should add) deal, but it's still pretty cool. I think these laptops are just about right for a lot of kids, like around Allie's age (5y). I am not aware of another product that even attempts to address this demographic anyway. I think I know one of the things Santa is going to be picking up this year.



[via Hackzine]


 
Categories:

2nd place is GNU emacs, which doesn't suprise me. Go emacs! The oldest is a graphics modeling package called BRL-CAD. It was started for the ZX-81, in 1983!

I wonder if there are any repositories at Microsoft that have been around that long and are still actively in use.

[via dzone]


 
Categories:

November 5, 2007
@ 10:58 AM

This is interesting:

    • Premier VSIP (Visual Studio Industry Partner) customers will have access to Visual Studio source code

Why do I think that's interesting? I was a little bit less surprised when they announced earlier that the .NET Framework source code would be available for people to look at - after all, we could kind of do that before with reflector.

This is different. I bet there is much more legacy code in VS than in .NET. You can kind of tell from the API...all the COM stuff that's there and the way there isn't much in the way of taking advantage of .NET features like reflection in the VS API. To me, and I'm just imagining here what it must be like for partners like TestDriven.NET, DevExpress, Resharper, and Softperson, this source code - the Visual Studio source code - is much more important and valuable. There _was_ no reflector for this stuff, and it seems, in my limited experience building add-ins with Devexpress's DXCore, that there are a lot more great mysteries here than in the rest of the .NET landscape. It seems like Visual Studio is the Marianas Trench of the .NET world.

I can't wait to see what awesome new things the Visual Studio Integration vendors will come out with next.

The only one little nit picky thing that I see that I kind of don't like 100% is that it looks like this behind the curtains access is only for premier VSIP members. I wonder if they would wave the $10k/year * 3 years fee for open source projects that want to integrate with visual studio. Or are those guys just out of luck?


 
Categories:

November 4, 2007
@ 10:27 AM

I am kind of famous for inundating my friends with links to stuff I want to talk about. I think I've finally found an easy way to automate this: shared items in google reader. I've put the last 5 links I've shared in the sidebar of this weblog. There is also a feed if you'd just like the links in your reader. I hope someone finds this useful!


 
Categories:

November 2, 2007
@ 12:20 PM
Categories:

November 1, 2007
@ 04:07 AM

Coding Horror has a good post on what the low bar is for build processes, here. I just wanted to add an experience I am in the middle of.

I have been a big fan of build automation for a long time. The past few years, this has meant cruisecontrol.net, nant/msbuild, etc. I know from experience this is not the norm in corporate environments, and I think I know why.

For all the goodness you get from a process like this, it usually ends up being pretty fragile. You get some mystery build breakage and your day is shot. This is tough to work through in a corporate environment where the business perceives no value from what you are doing.

I used to feel bad about it, but there are times when I leave the build broken for quite a while - usually when I am the only developer on a project. There I said it. I broke the build.

  • Maybe cruise control isn't configured right, and isn't getting a clean working copy.
  • Maybe the cheap little VM running under someone's desk the hosts the build server is out of disk space.
  • Maybe the xslt that turns the xml output from mbunit doesn't support some new attribute that mbunit is outputting.
  • Maybe the reports we are looking at are actually from stale artifacts.
  • Maybe a unit test runner is hung, holding a connection to a database the build process wants to drop and recreate...

These are all things that have happened at various times to break my builds. They were all a PIA to find too, when I don't have time for this. It's worse when you see someone else wanting to start down this road, and you think, "I want to help this person...but am I going to have time to answer their questions when the above things happen? Am I making work for myself?" Maintaining a build is a job, and when you're a corporate developer, it's usually not yours, even though we all see that it's important and somebody has to do it. It's the equivalent of making mo' when you kill the joe. But when you're not a barista, you're not going to be competing with Starbucks. That's the analogy: We don't have a Starbuck's build process and it's foolish to shoot for one. We're not starbucks, let's just shoot for having joe in the pot.

So...now that that's out of the way, I had to do some build maintenance a few weeks ago. My build is broken. It's not expected. I don't know why. Builds on my machine. I'll have to dig around and figure it out. I wasn't looking forward to it, so I thought I'd liven things up by checking out a tool I heard a good review of recently: CI Factory. So far, I am duly impressed. The only tough thing for a person like me is sticking to my stated goal (to my co-workers) going into using this tool: "I am tired of maintaing this crap. I just want to let someone else do it..."

CI Factory has strong opinions about where files should go, how the build should work, and how things in general should be organized. I had to change the way I worked in order to accommodate it, but it was worth it. I only had to make the easiest possible changes - basically it amounted to a couple of svn renames. In exchange, I got a very slick out of the version control system build experience. It's really nice. Checkout, and Bam! You've got a build server. Literally, "svn co svn://server/trunk/ProjectName C:\Projects\ProjectName\Current; C:\Projects\ProjectName\Current\Build\CCNetServer.bat". Two commands, and I am integrating. All the reports in ccnet worked out of the box. It found all my unit tests. I had coverage reports out of the box. All dependencies are in the VCS - even the CC Net server and config! That was something I hadn't tried before, but like I said, this software has an opinion.

The fine line is, when it doesn't quite do what I want, resisting the urge to change things. Everything you change, you have to maintain. I don't want to live like that anymore. I end up changing things as little as possible, and living with what CI Factory does for me.

I have wanted to write about this for a while, but have been waiting until I can say for sure that this has ended most of my build maintenance time sink. I think it's kind of safe to say that at this point. The only thing left I still have to deal with is a massive WiX script - this is for a web app that installs hundreds of files, which all need to be called out in the wxs.

The web app is actually a great example of where I went with the flow instead of creating more maintenance. This project has (had) an ASP.NET web site. I still kind of prefer web-site projects for various reasons, but I was having trouble getting the asp.net compiler + aspnet merge + the build + wix to work together, I was 5 minutes into editing a nant file, after half an hour prototyping the aspnet_* commands I wanted on the command line, when I realized I was swimming upstream. Why not just change to a web project. This was actually easier, took about 15 minutes, and I was done, no new maintenance work.

Anyway, if you are looking at setting up a build process, this seems like the best way to do it. You can't really go wrong, because it's just going to create a bunch of nant files for you and ask you to move your code around slightly. If you don't like it, you can leave at any time. It's not going to change your code, your project files, or anything like that. Give it a try!


 
Categories: