Tuesday, July 28, 2009

Late 2009 Software List (Mac)

Following right behind my list of standard Windows applications I have installed, here is my list of developer tools, utilities, and general purpose software I have installed for Mac OS X.

Development
  • SubEthaEdit: Great text editor that includes revolutionary collaboration support through Bonjour
  • TextWrangler: Free text editor for Bare Bones Software; subset of their BBEdit product
  • TextMate: Powerful text editor used by the Ruby on Rails team
  • Xcode: Apple's IDE; bundled with Mac OS X, but not installed by default
Browsers
  • Safari: Apple's built-in browser, and my personal favorite
  • FireFox: Fully featured and extensible browser; very popular for its features and standards support; you'll probably want to install FireBug, a web development plugin for FireFox
Web
Media
  • VLC media player: Plays every file I've ever thrown at it, with a minialistic and Mac-native interface
Communications
Office Suites
  • Office 2008 for Mac: I got a great deal on Black Friday 2007, otherwise, I wouldn't have a copy; it is nice for working with the latest native Microsoft formatted documents
  • iWork: Consists of Apple's word processor (Pages), spreadsheet (Numbers), and presentation software (Keynote); great for the price, and does everything I need it to
I didn't include a utilities section this time, because OS X comes with a plethora of small application. Here's the list of bundled applications I have in my Dock:
  • Dictionary
  • Calculator
  • TextEdit (defaulted plain text mode)
  • The whole iLife suite (iTunes, iPhoto, GarageBand, iMovie, and iWeb)
  • DVD Player
  • Time Machine
  • iSync
  • Software Update
  • Activity Monitor
  • Console
  • Network Utility
  • Terminal
I've also trimmed my Dashboard widgets down to Weather only.

The only other observation I'd like to make is that besides having the OS come with more applications, the applications I do pay for are a lot cheaper altogether than the applications I pay for on Windows.

Monday, July 27, 2009

Late 2009 Software List (Windows)

Inspired by Scott Hanselman's Ultimate Developers and Power Users Tool List for Windows (the latest version I could find was 2007), I'ved decided to create my own. FYI, I'm running Windows 7 (64-bit) on a Mac Pro.

Update: You can find my Mac list here

Development and Design

Browsers

  • Internet Explorer 8: Built into Windows or available as an upgrade; be sure to upgrade to version 8 if you haven't already!
  • Google Chrome: Google's browser; fast and small, but lacking in extensibility; I'm also subscribed to the Dev Channel, giving me frequent auto-updates
  • Mozilla FireFox: Fully featured and extensible browser; very popular for its features and standards support; you'll probably want to install FireBug, a web development plugin for FireFox
  • Safari: Apple's browser; allows for Mac and iPhone compatility testing, since all of Apple's version are based on WebKit; version 4 plays much nicer with Windows

Web

  • uTorrent: The best and fastest torrent client out there
  • 7-zip: Open source zip file utility; integrates nicely into the shell
  • Adobe Flash Player: Only on the list for youtube and the occasional game trailer
  • Foxit Reader: The free and best PDF viewer out there; dump your Adobe Acrobat garbage immediately if you haven't already

Media

  • QuickTime: Yes it's slow and doesn't play nice on Windows, but the video quality is good, and there are a lot of movie trailers on Apple's website
  • iTunes: Only installed to get MP3s on my iPod
  • PowerISO: Great utility for creating and extracting .iso files; supports CD/DVD burning too
  • VLC media player: Plays every file I've ever thrown at it, with a minialistic interface

Communications

  • Windows Live Messenger: While others are available, supports what I need without much fuss after some tweaking
  • Skype: Free voice-over-IP (VOIP) client; you can upgrade your account to make phone calls too
  • SharedView: Screen sharing application from Microsoft; very handy for remote folks

Utilities

  • WinSplit Revolution: Great utility for moving/resizing windows; includes quite a few defaults and can be customized

Office Suite

  • Office 2007: Includes Word, Excel, PowerPoint, Outlook, and others, depending on the version; if you can't afford Office, don't want to pay for Office, or don't care for the ribbon interface, give OpenOffice a try

Friday, July 17, 2009

The Essence of Software Craftsmanship

Alan Stevens gave a great talk at the Nashville .NET Users Group last night titled "The Taming of the Code". One of the points he got across what that trying to explain good software engineering principles to new or stagnant developers on your team is really hard. And it's hard for a few reasons:
  • The terms can be strange and hard to remember (The Liskov Substitution Principle)
  • The principles themselves will seem theoretical to those that don't grok them immediately
  • Measuring the value of good engineering is next to impossible, so a bunch of rules without good justifcation probably won't happen

Alan's talk wasn't specific to these points, but seemed to acknowledge the difficulty in the expression and adherence to good engineering principles. The way he thinks you can get around such problems is by distilling them down to their fundamentals:

  • Don't repeat yourself (DRY)
  • Separation of concerns

I agree 100%. It's tough to argue against DRY, and when followed, eliminates a lot of bad coding practices immediately. While separation of concerns is a little harder to explain, the metaphor Alan used to explain it was seams within your application. A great quote he referenced from Jeremy Miller was something along the lines of "I don't try to figure out how to write code any more, now I try to figure out where to put it". The SOLID Principles have a bunch of rules that help guide you into putting code into the right places, but by just saying that all business rules are enforced behind the seam of the business classes gets the point across easier. I think taking the approach of streamlining and simplifying our communication within the community could go a long ways towards improving the craft overall.

I see a lot of potential in communicating and adhering to the two principles Alan has boiled things down to.

Tuesday, July 7, 2009

"Safe" Choices

In my previous post, "Dangerous" Choices, I discussed the reasons why some of the more vocal members of the programming community advocate technology choices that are emerging. At the same time, today's most popular choices are considered somewhat boring, uninspired, and unexciting (since everybody's doing it). There are, however, a few things they got wrong:
  • Technologies like C# and Java are being constantly updated with new language features and technologies (LINQ, MVC, Silverlight, Hibernate, Spring, etc)
  • My own personal experience shows that under the right circumstances, you can work at a great place doing work that pushes you in technical directions you haven't been in before
  • Trying to switch technology stacks is difficult if you're not in the first wave of switchers, since you'll lag behind everyone else in experience, making your job search more difficult, as the pool of resources is smaller and their expertise is generally higher

I'm a C# developer by day, but play around with Ruby on Rails and Groovy on Grails at night. While it's true that C# is missing certain language features like duck typing and closures (although anonymous methods and delegates fill that gap in faily well), it's a language that has evolved signficantly since its first release, and it quite a capable language for most applications being developed. Between LINQ and the new MVC framework, there is little that other platforms can offer that are truly compelling (unless, you insist on avoiding Microsoft technology altogether, which is a close-minded and bigoted mindset in my opinion). In fact, I would argue that using the Microsoft technology stack is actually the more productive choice, given the tooling.

Visual Studio's intellisense, while often frowned upon, makes the .NET framework far more accessible than Grails or Rails, due to the discoverability of methods and properties. If I'm not sure what methods are available for strings, just typing a dot gives me a wealth of information. Yes, editors like Eclipse and IDEA are getting support for some of these budding technologies, but today, you have to rely heavily on documentation.

Then there's debugging and compilation. Hey, I'm a fan of static langauges, if for no other reason that the compilation feedback I can get. I don't have to take seconds/minutes to run unit or integration tests to see if my last commit is syntactically valid. I've also got a nice debugger that will let me step through the code without resorting to printing output to the console. Again IDE support will improve things for Grails/Rails, but it's not fully baked today.

Finally, I want to address the job market. There are great companies out there in the Microsoft space doing exciting and cutting edge work. Take Vertigo, Wintellect, and Thoughtworks (yes, that Thoughtworks). They're all doing large and small projects using the latest and greatest stuff. I'm sure that there are many other good companies out there with a great group of developers coding against the newest stuff.

In fact, if I had to define what I really believe "safe" versus "dangerous" to be, it's more about how soon you're willing to adopt new technologies, not what platform you're on. I've worked for some pretty big companies in the past, and I always found frustration in their reluctance to move to new offerings at a reasonable pace (over a 3 year wait on .NET, for example).

Don't get me wrong, if you want to work with some of the industry's current luminaries, you'll have to broaden your horizons beyond Microsoft, but in so doing, you'll probably pick up some things up you've never thought about if you don't anyway. Or worst case, you might be able to glean some wisdome from folks who have been doing it that way for years before Microsoft provided their own branded version. And since you're programming because you love it, wouldn't you love learning something completely new? The pragmatic programmers often instruct learning a new language a year to expand your horizons, and that's a good thing. Just don't turn your back on C# or Java because you've been doing it a while; there's still plenty to learn and new frameworks popping up all the time that expose something new to learn too.

Friday, July 3, 2009

"Dangerous" Choices

Most of the material I've read lately about being successfully in the IT industry have all suggested moving away from the safer choices (Java, C#, Windows, etc.) and moving into the more emergent technologies (Rails, Grails, Mac OS X, Linux, etc). The idea is that picking a technology before it becomes widespread offers a few advantages:
  • You become an expert before others
  • If you take the risk and pick the right technology, the monetary rewards can be high; much higher than normal
  • Most of the alpha geeks are already there, and you want to be working with the best and brightest, don't you? I know I do
Being a expert in a technology field is a great thing to strive for. I also think keeping up with the technology trends and new ideas helps you become a better programmer, even if you don't ever use those technologies at work, because by using different technologies, you're forced to solve problems in new ways.

While some of the emergent technologies have been around a lot longer than they've been on anyone's radar, they have all experienced near explosive growth as of late. Despite the major strides these technologies have made, the job markets remain small. I also have trouble finding fringe jobs that pay as well as the more established offerings. Take Rails or Grails. I think they're both great technologies that have a lot to offer. But looking on Monster or Dice doesn't reveal anything worthwhile from what I can tell. So what's the problem? I think there are a few things at play here.
  • Most of the really good jobs are never advertised
  • The alpha (and beta?) geeks know each other, and are quick to fill positions through word of mouth
  • Most of the cool stuff right now is open source, so the jobs that most people do hear about are with companies that are just getting started or using open source to save money
I don't have issue with the first two points, but personally, I'm not ready to cut my salary in half just to work with some technologies that may or may not work out in the long run. If the only danger to these technologies was long term viability, that would be different. Even taking a 10-20% pay cut would be different. But not being able to find those jobs, and when I do, to take a 40-50% cut is where I have to pause.

Maybe I'm just a Gamma Geek, too far removed to know the right people. Maybe I'm looking in the wrong places. But maybe the safer choices aren't so bad.

Wednesday, July 1, 2009

Pits of Success

The latest Herding Code podcast was a rehash of some of the issues with Visual Studio discussed over Twitter. One of the main issues discussed was drag and drop coding. Why do people use it? Why do we see it in so many demos? Why aren't there more warning about using it with caution?

The responses from Alan Stevens lead me to believe that Microsoft doesn't recognize how damaging drag and drop coding can be (and how most developers have disdain for it). Alan's justification was that it you're aware that it incurs technical debt, you're ok. In other words, while it generally produces sub-optimal code, as long as the amount of time savings can be justified now for a refactoring later, it's acceptable. There are a few good reasons why it isn't:
  • It teaches a lot of developers bad practices, and those practices never get improved
  • Developers are either forced to search find an alternate means to learn a technology or reboot their current methodology to do it right
  • It creates really bad code that is hard to maintain
  • Most projects don't have the time budget for refactoring; besides, who wants to write their code poorly from the start?

What Microsoft has inadvertantly done (and continues to promote) is a method of coding that leads to failure. Instead, what they should be doing is providing a set of sensible defaults and conventios that lead to success. These practices are quite common outside of the Microsoft community; you'll find frameworks like Rails or Grails impelmented in such a way that they create a pit of success. The conventions and defaults are engineered in such a way that its easy to fall into the "trap" of doing things the right way by default.

Don't get me wrong, Microsoft makes some great products, and continues to improve their offerings (the new MVC framework is a great example). However, by continuing to teach developers bad practices, they're creating a pit of failure.