Enjoy TiddlyBuild.
TiddlyBuild, the single-file build light.
Joel and I threw together a super-simple build light for TeamCity today. The standard project views are too cluttered for broadcasting big colourful messages.

Tech Leaderisms.
Are you a developer? Yes? Then I'm sorry to tell you, friend: There is a Tech Lead in you. Rather, someone will try to make you a Tech Lead one day. For your future Tech Lead self, I recommend reading the corresponding articles, A Tech Lead Manifesto and Behaviours of a Tech Lead (written by colleagues Sam Newman and Pat Kua, respectively).
To those insights, I add these recommendations:
Know Your Teammates
Before you start, talk to everyone. Understand each developer's goals and fears with respect to your upcoming project. Know the strengths and weaknesses of everyone on your team, and formulate a plan for dealing with both. Sketch out your team roster and ensure that the experience and skill level is balanced.
Use Two-Pizza Teams
I'm not sure who first coined this, but I love the idea. I also like the idea of trying it out in reality: Have an in-office team dinner. Order two pizzas. Were you left hungry? Your team is too large. Or you have one gluttonous developer. But probably your team is too large.
Given an oversized team by this yardstick, work with all stakeholders involved to divide up the project. You may even find additional value in simplifications required to divide up your previously bloated project.
Develop Horizontally Until Release 1
It may seem obvious, but I'm still surprised how often this rule is ignored. If you haven't deployed into a production environment yet, build out -- not down. Complex business rules will materialize in every story. They always do. Create new stories from these rules and put them on the shelf until they are truly more important than the next functional story coming down the pipe.
As a Tech Lead, you share this responsibility with your stakeholders. At the end of the day, they will decide what is most important. However, the unseen complexity of a business is visible to you because it materializes as code; share this with everyone.
Build It Yourself First
All too often slogans such as "You Aren't Gonna Need It" are thrown around the the software community until they're almost law. Lately, I find the most troubling to be "Not Invented Here Syndrome"; more often than not, I find the opposite Syndrome afflicting developers: "There's a Framework For That! Syndrome"
Sure there is. Build it yourself anyway.
The majority of frameworks are simply implementations of patterns. Whether as ubiquitous as Dependency Injection, or as domain-specific as a shopping cart, try implementing the pattern yourself before reaching for the nearest third-party library. You very well might throw it away, but often you'll end up with an implementation which is significantly lighter and easier to test.
Keep Metrics and Ratchet Your Build
Chris wrote about "ratcheting" recently. Go read it! The flip side of ratcheting is, of course, preventative medicine. Why wait until you have 60 TODOs before breaking the build? Place as many reasonable limits on yourself as you can, early on. In the thick of the project your motivation to do so might be overruled by the desire to Just Write Code. Tools such as Panopticode, metric_fu, PMD, and Gendarme will help you a great deal, but they're just the tip of the iceberg. Be creative not only in the tools you choose, but the rules you write and the metrics you extract.
To those insights, I add these recommendations:
Know Your Teammates
Before you start, talk to everyone. Understand each developer's goals and fears with respect to your upcoming project. Know the strengths and weaknesses of everyone on your team, and formulate a plan for dealing with both. Sketch out your team roster and ensure that the experience and skill level is balanced.
Use Two-Pizza Teams
I'm not sure who first coined this, but I love the idea. I also like the idea of trying it out in reality: Have an in-office team dinner. Order two pizzas. Were you left hungry? Your team is too large. Or you have one gluttonous developer. But probably your team is too large.
Given an oversized team by this yardstick, work with all stakeholders involved to divide up the project. You may even find additional value in simplifications required to divide up your previously bloated project.
Develop Horizontally Until Release 1
It may seem obvious, but I'm still surprised how often this rule is ignored. If you haven't deployed into a production environment yet, build out -- not down. Complex business rules will materialize in every story. They always do. Create new stories from these rules and put them on the shelf until they are truly more important than the next functional story coming down the pipe.
As a Tech Lead, you share this responsibility with your stakeholders. At the end of the day, they will decide what is most important. However, the unseen complexity of a business is visible to you because it materializes as code; share this with everyone.
Build It Yourself First
All too often slogans such as "You Aren't Gonna Need It" are thrown around the the software community until they're almost law. Lately, I find the most troubling to be "Not Invented Here Syndrome"; more often than not, I find the opposite Syndrome afflicting developers: "There's a Framework For That! Syndrome"
Sure there is. Build it yourself anyway.
The majority of frameworks are simply implementations of patterns. Whether as ubiquitous as Dependency Injection, or as domain-specific as a shopping cart, try implementing the pattern yourself before reaching for the nearest third-party library. You very well might throw it away, but often you'll end up with an implementation which is significantly lighter and easier to test.
Keep Metrics and Ratchet Your Build
Chris wrote about "ratcheting" recently. Go read it! The flip side of ratcheting is, of course, preventative medicine. Why wait until you have 60 TODOs before breaking the build? Place as many reasonable limits on yourself as you can, early on. In the thick of the project your motivation to do so might be overruled by the desire to Just Write Code. Tools such as Panopticode, metric_fu, PMD, and Gendarme will help you a great deal, but they're just the tip of the iceberg. Be creative not only in the tools you choose, but the rules you write and the metrics you extract.
The C# expatriate: Tips for settling in Java.
Friday signaled the end of my first Java project in 6 years. Coming from a C#/.NET background, the learning curve was not steep -- but by the end of the project I had learned enough small lessons to serve as the basis for this little document.
If you happen to move from a .NET project to a Java project, have a look through these pointers. This is all the advice I wish I had when I started this project six months ago.
1. Learn all your new tools, inside and out.
As a C# developer, you're already utterly dependent on ReSharper. You will undoubtedly feel at home in IntelliJ. The majority of your day-to-day keyboard shortcuts will remain the same. Those that map directly map closely (CTRL+- is replaced with CTRL+ALT+LEFTARROW).
However, ReSharper is a plug-in which makes .NET development tolerable. IntelliJ is a work of art -- and it makes programming a joy. Install the Key Promoter plug-in and never look back.
2. Find New Tools
As far as I know, nothing like Panopticode exists for C#. Guice almost certainly doesn't. Explore the landscape and enjoy the rich open source bibliotheque that we're missing on Microsoft-funded frameworks.
3. Testing and Mocking
Use JUnit 4. Use Mockito. Try jBehave.
4. Collections
Eagerly write custom collections and provide yourself with methods for collecting, filtering, and all that other fun stuff. You can augment this with Hamcrest Collections, but keep in mind it's still v0.1.
5. Other Wrappers
Be even more aggressive about wrapping standard APIs than you would be in .NET. Why? Like collections, the .NET base class libraries have a (small) leg up on Java, thanks to watching Java grow and change. Because of this, you will periodically find features missing you might expect from the standard API. To be fair, once you've become accustomed to eagerly wrapping standard APIs in Java, carry that back to .NET with you. Chances are good you weren't wrapping enough stuff when you were last writing .NET. (I know I certainly wasn't.)
6. Dates and Times
The Java DateTime libraries are beyond useless; use JodaTime from day one. If anyone imports the JDK DateTime packages, fail the build. Joda comes with all the Hibernate jazz you need to persist Joda's DateTimes, so you're good there.
7. Apache Commons
Use it. It rocks. When you go back to .NET, steal ideas.
If you happen to move from a .NET project to a Java project, have a look through these pointers. This is all the advice I wish I had when I started this project six months ago.
1. Learn all your new tools, inside and out.
As a C# developer, you're already utterly dependent on ReSharper. You will undoubtedly feel at home in IntelliJ. The majority of your day-to-day keyboard shortcuts will remain the same. Those that map directly map closely (CTRL+- is replaced with CTRL+ALT+LEFTARROW).
However, ReSharper is a plug-in which makes .NET development tolerable. IntelliJ is a work of art -- and it makes programming a joy. Install the Key Promoter plug-in and never look back.
2. Find New Tools
As far as I know, nothing like Panopticode exists for C#. Guice almost certainly doesn't. Explore the landscape and enjoy the rich open source bibliotheque that we're missing on Microsoft-funded frameworks.
3. Testing and Mocking
Use JUnit 4. Use Mockito. Try jBehave.
4. Collections
Eagerly write custom collections and provide yourself with methods for collecting, filtering, and all that other fun stuff. You can augment this with Hamcrest Collections, but keep in mind it's still v0.1.
5. Other Wrappers
Be even more aggressive about wrapping standard APIs than you would be in .NET. Why? Like collections, the .NET base class libraries have a (small) leg up on Java, thanks to watching Java grow and change. Because of this, you will periodically find features missing you might expect from the standard API. To be fair, once you've become accustomed to eagerly wrapping standard APIs in Java, carry that back to .NET with you. Chances are good you weren't wrapping enough stuff when you were last writing .NET. (I know I certainly wasn't.)
6. Dates and Times
The Java DateTime libraries are beyond useless; use JodaTime from day one. If anyone imports the JDK DateTime packages, fail the build. Joda comes with all the Hibernate jazz you need to persist Joda's DateTimes, so you're good there.
7. Apache Commons
Use it. It rocks. When you go back to .NET, steal ideas.
I am that alien.
"Somehow the competing teams of aliens can see our world through our eyes when they want to, and can influence our actions by ramping up or down on our desires. They can't control our specific actions, just our general propensities, making us, for example, hungrier or hornier or lazier than normal whenever that would be a strategic advantage in the game."
Scott Adams - Sci-Fi Plot
Scott Adams - Sci-Fi Plot
Tables.
Human beings can comprehend mathematics. At some point, we discovered the triangle -- a brilliant, reusable piece of beauty and simplicity.
Why do we still build tables with four legs?
Why do we still build tables with four legs?
Cartoons and comic books.
The curiosity of my coworkers at ThoughtWorks often leads to a number of healthy and interesting debates, which often occur in the pub, on internal mailing lists, and anywhere in-between. One such discussion, of the mailing list variety, revolved around the topic Chinese economics and politics. Inevitably, the recent Angry Red Dragon issue of The Economist was mentioned in passing as participants shuffled over the topic of general Western opinions on China.
Most people I know were furious when they saw the Angry Red Dragon. I was elated. For years, I've taken to ribbing any of my friends who read The Economist; although the writing is entertaining, the topics various, and the grammar impeccable, I still find it offensive that such a magazine sells itself as "news" for the same I reason CNN disgusts me. It's not news. It's entertainment. It's a comic book.
Fox News has been getting it right for years now. Kurt Vonnegut's obituary-thing is the perfect example -- no one at Fox is pretending they're running a news channel. It's a cartoon and that in itself is not entirely disagreeable. No one I know would take such material at face value.
Other sources of information, though, seem to slip through this filter simply because their content is well-delivered and free of lunacy. Why is this the case? Even if we find a media outlet without opinion or agenda, what on earth makes us think they could possibly collect all the facts or perform a complete analysis?
Although we all ask ourselves that exact question and respond with "of course that's silly! I always question everything I'm told," sometimes it's not so obvious. As human beings, we're remarkably fallible. I've read Economist articles in the past and forgotten, mid-stream, that the material I'm consuming is For Entertainment Purposes Only. It's an easy rule to forget -- we all do it -- and there's nothing quite like thinly-veiled racism (or other abhorrent messaging) to remind us that media we consume is largely trash.
Most people I know were furious when they saw the Angry Red Dragon. I was elated. For years, I've taken to ribbing any of my friends who read The Economist; although the writing is entertaining, the topics various, and the grammar impeccable, I still find it offensive that such a magazine sells itself as "news" for the same I reason CNN disgusts me. It's not news. It's entertainment. It's a comic book.
Fox News has been getting it right for years now. Kurt Vonnegut's obituary-thing is the perfect example -- no one at Fox is pretending they're running a news channel. It's a cartoon and that in itself is not entirely disagreeable. No one I know would take such material at face value.
Other sources of information, though, seem to slip through this filter simply because their content is well-delivered and free of lunacy. Why is this the case? Even if we find a media outlet without opinion or agenda, what on earth makes us think they could possibly collect all the facts or perform a complete analysis?
Although we all ask ourselves that exact question and respond with "of course that's silly! I always question everything I'm told," sometimes it's not so obvious. As human beings, we're remarkably fallible. I've read Economist articles in the past and forgotten, mid-stream, that the material I'm consuming is For Entertainment Purposes Only. It's an easy rule to forget -- we all do it -- and there's nothing quite like thinly-veiled racism (or other abhorrent messaging) to remind us that media we consume is largely trash.
We need more onomy.
The other day I was listening to assorted tracks in my reading room while enjoying a glass of scotch and puttering away in the codebase of my current project. I was feeling chipper, the sun was shining. On Saturdays I'm willing to play the music loud enough to feel engrossed and I was looking for a bit of a beat in most of what I was listening to.
I own an iPod Video, and if we discount the fact that Winamp seems to be the only reliable way of getting data on and off the device, it does a satisfactory job of playing music. Selecting music, however, is a chore. None of the predefined labels in the iPod taxonomy (or the taxonomy of any other music player I've ever used) satisfy my needs: Artist? Genre? Just what is a "genre," anyway? And how do I differentiate between Electronic, Electronica, and Electronica/Dance? Or Folk, Folk/Country, Folk/Rap, and Reggae/Folk?
I'd love to see a taxonomy for music based entirely on well-articulated emotion or situation. That is, the primary detail describing the music would be details of potential consumer environments, rather than details of the musical quality itself. Because music is so notoriously difficult to classify in the first place, I don't see why a difficult, albeit inverted, classification scheme isn't worth a go.
An open-ended tagging scheme would work well for this, so perhaps the folks at last.fm or MusicBrainz have already solved this problem... I don't know. I don't use the internet often enough to pay attention to this stuff. But searching one's own collection for tags such as 'emotion:elated,complacent' and 'situations:alone,underground coffee shop' would save those of us who don't have the energy to invest in memorizing albums.
Such a system would actively encourage group classifications to avoid the obvious potential single-minded environmental appreciation of music stemming from individuals producing this meta-data. But then, these classification parties would tend toward an eventual situation of 'classification party'.
...so maybe it wouldn't work after all. But I still wish UIs for music-selection had improved in the last 15 years.
I own an iPod Video, and if we discount the fact that Winamp seems to be the only reliable way of getting data on and off the device, it does a satisfactory job of playing music. Selecting music, however, is a chore. None of the predefined labels in the iPod taxonomy (or the taxonomy of any other music player I've ever used) satisfy my needs: Artist? Genre? Just what is a "genre," anyway? And how do I differentiate between Electronic, Electronica, and Electronica/Dance? Or Folk, Folk/Country, Folk/Rap, and Reggae/Folk?
I'd love to see a taxonomy for music based entirely on well-articulated emotion or situation. That is, the primary detail describing the music would be details of potential consumer environments, rather than details of the musical quality itself. Because music is so notoriously difficult to classify in the first place, I don't see why a difficult, albeit inverted, classification scheme isn't worth a go.
An open-ended tagging scheme would work well for this, so perhaps the folks at last.fm or MusicBrainz have already solved this problem... I don't know. I don't use the internet often enough to pay attention to this stuff. But searching one's own collection for tags such as 'emotion:elated,complacent' and 'situations:alone,underground coffee shop' would save those of us who don't have the energy to invest in memorizing albums.
Such a system would actively encourage group classifications to avoid the obvious potential single-minded environmental appreciation of music stemming from individuals producing this meta-data. But then, these classification parties would tend toward an eventual situation of 'classification party'.
...so maybe it wouldn't work after all. But I still wish UIs for music-selection had improved in the last 15 years.
Design oddities from another universe.
Man. Whose job is it to come up with this shit? Here is what this dialog box says to me:
Hey, sorry. Because the software we wrote for you is riddled with security holes, we have to turn your computer off at random... in the night. Like ninjas. Or vampires. Or ninja-vampires who come in the night to destroy your data and then tie you down to your bed and tickle your feet until you scream. And then suck all the blood out of you through... your nipples. Yeah. And maybe then we'll throw salt on your bloody nipples just for good measure, even though you're already dead. Because we hate you. A lot.
Well, I'm starting to hate you too, Microsoft. My current project requires that I use a Windows laptop on a daily basis. I've grown quite accustomed to Ubuntu and OS X over the past few years. As much as I'll harp about the fact that Apple's computer platform blows Windows out of the water when it comes to "how much proprietary do ya gots?" -- at least it works. Windows XP is the new OS/2: it's cute, it worked once, but now we need to convince our co-workers it's time to move on.
Rock the shortcuts.
Devcamp Bangalore, Barcamp Pune!
If you are near the south or west of the subcontinent this college fest season, be sure to sign up for devcamp Bangalore and Barcamp Pune. Each unconference will run out of the respective ThoughtWorks office, and Sexy MF will be in attendance. If you're coming to Barcamp, let me know!
Outdone.
Life in India incurs smaller expenses than life in Canada. (Unfortunately, it also involves a smaller salary; my Indian salary is approximately minimum wage in Canada.) Rent is reasonable ($225/mo) and food is as cheap as you'll find it anywhere -- even to eat out ($2 will stuff you in a cheap restaurant).
But if Geoff can accomplish the $10/day February he has planned, he'll blow me out of the water.
But if Geoff can accomplish the $10/day February he has planned, he'll blow me out of the water.
Subscribe to:
Posts (Atom)
