By Peter Bell

CFArgument - On Learning Something New

This week Brian and I debate Neil Middleton's controversial post "ColdFusion Developers - Please Learn Something New." Neil argues that ColdFusion developers need to broaden their horizons and learn a new language. He uses the example that after learning Ruby on Rails he has decided this is a superior solution to ColdFusion. However the overall point he is trying to make is that there is value in continually learning and exploring new languages . . .

Brian Rinaldi
Reading Neil Middleton's recent post got me thinking on a number of levels. First of all, I will make it clear that I agree with his overall point that it is good for developers to learn new languages and broaden their horizons but I think that the direction he took his post is disturbing. First of all, it is directed solely at ColdFusion developers which, to me, seems to be playing off of a particular tendency of developers in other languages to look down on ColdFusion developers as unsophisticated and close-minded. Also, he doesn't seem to have gone about broadening his mind but rather changing it (in favor of RoR) and in hindsight is positioning this decision in the most favorable light (not that I think there is anything wrong with using RoR).

Peter Bell
It's a really interesting topic that he brought up on a number of levels. I'm going to start by questioning his assumption that you should keep learning new languages (prag progs orthodoxy notwithstanding). I agree that the best developers are continually learning new languages, patterns and approaches. It is the only way to be a master programmer. I would question whether everyone who makes a living slinging code necessarily has to aspire to excellence. Many ColdFusion developers would get more benefit from spending a little time learning Eclipse keyboard shortcuts, playing with ColdBox and trying TDD using MX Unit than in sharpening up their Scala skills to be able to "get" functional programming and argue the benefits of a relatively low ceremony, strongly typed language.

Brian Rinaldi
You do have a good point. When I have been faced with similar choices myself or have been asked by people what I recommend they learn, I generally have a preference for choosing a complimentary skill. A while back in my career, I decided to broaden my skills and learn ASP (there was no .Net yet). The problem was that this skill would either have replaced ColdFusion or fade away (obviously it did the latter). The reason being that since both skills accomplish the same end result, I would inevitably choose one over the other either by personal preference or career necessity. If I had spent that time learning something like Java, for example, it would complement my ColdFusion skills.

Peter Bell
Agreed. In fact I'd go as far to suggest that if you've not played with TDD, don't have in-depth knowledge of at least one ColdFusion MVC, Dependency Injection and Persistence framework (ideally multiple) and don't have a proper personal dev environment, source control, an automated build process and (ideally) some kind of Continuous Integration setup, there are way more pressing issues than trying to half learn another language to use.

Brian Rinaldi
Huh. I suppose I better get busy then. ;)

Well, I think there is value in learning the ways in which a new language solves problems. For example, I think that learning Flex and ActionScript 3 has made me a better programmer in ColdFusion, in particular related to object-oriented development. In addition, knowing and using frameworks in ColdFusion made it easier to learn the frameworks in Flex. So, in some respects these skills can build upon each other. It doesn't have to be either/or.

Peter Bell
I agree that you get benefits from learning other languages. In particular, I think most CF developers would get something from learning Java (for the underpinnings and to "get" high ceremony OO), one of Ruby/Groovy/SmallTalk to understand dynamic OO languages, and probably Scala to get a feel for a modern functional language. But if I had to prioritize, I'd still take a developer that really gets best practices in ColdFusion over one who writes code badly in multiple languages!

Brian Rinaldi
Its important to keep in mind this doesn't apply just to ColdFusion developers. I think their are close-minded and narrow developers in every language. ColdFusion developers tend to be overly passionate in defense of their language but it doesn't mean they are any less knowledgeable as a group.

You are going to need to start saying something I disagree with if this post is going to live up to its title!

Peter Bell
Working on it, unfortunately you're being a little too reasonable this week!

That's an interesting point to bring up. I certainly agree that there are plenty of closed minded fanboys for every programming language. I'd argue that (all other things being equal), the more mature a language, the more popular it was over its lifetime and the easier it is to learn, the more likely you are to find programmers in that language that don't have any experience in other server side languages and that are less broadly experienced or skilled. As such I'd expect that the lowest average programmer skill level would probably run something like PHP, ColdFusion, VisualBasic.NET, Java/C#, Ruby, Groovy, Scala. Scala programmers are probably on the whole much more widely experienced and skilled than CF developers as there is no good reason to learn Scala other than being a programming polyglot. As such, the people who *have* learned Scala can probably code in at least 5-6 other server side languages.

So I'm going to suggest that (a) most ColdFusion developers *shouldn't* start by learning a new language - they've got other stuff to fix first, and (b) that while Neil should probably have mentioned PHP too, there probably are more "bad" CF coders than (say) bad Groovy or Scala coders. So I'm disagreeing with both of your points. Is *that* enough to kick off an argument? Or are you admitting defeat early this week?!

Brian Rinaldi
Well, I have no real data to back this up of course, but I would probably agree that when a language is new it tends to bring in the high level developers that can easily jump from language to language. So, what I am saying is that this isn't necessarily a function of the language but perhaps of its relative newness on the scene.

My concern with Neil's post is that it seemed to imply this narrowness is a function of the language and that its of some particular imperative for a ColdFusion developer to learn something new over a developer of another language. Perhaps Groovy developers, given its newness, already know other languages while many ColdFusion developers don't. However, I would guess that you might find a similar single language focus among say PHP developers or even some of the young developers who started in RoR and haven't ventured far beyond it.

I am not defending that narrowness just that its not specific to CF developers.

Peter Bell
It's tough. The fact is that ColdFusion was designed as a language to allow non programmers to easily build web applications. Because of its success, there are plenty of people who make a living writing CFML who probably aren't very good programmers. I would absolutely agree that the same goes for PHP. RoR is probably a little better as even if a programmer has only ever coded in Rails, at least they probably think about things like Unit Testing and Integration Testing only because it's build right into the framework and examples.

Whatever happens, I think it was a useful posting. You may not need to learn another language, but to learn another skill or framework is something that would help any developer to do their job better (and to become more employable) over time.

Brian Rinaldi
I think you hit the nail on the head. If we focused on new skills (as opposed to just languages), its something anyone can benefit from. This doesn't mean you won however. ;)

Peter Bell
Sore loser :P

Comments
I'd have to agree with Peter that, at least for me, there is so much to learn as a CF dev (client side stuff like Flex, AS, AJAX, as well as frameworks, design patterns, TDD, source control, etc.) without also having to jump to learn another server-side language. And when you don't have all the time in the world, really learning (not just dabbling) Java or RoR or what have you may not be practical (as I said in the comments of Neil's post). I find pragmatism in not going through the effort to learn another language "just for the heck of it." If I ever see a lot of projects come my way that CF can't handle, THAT would be a good reason to explore other shores, but I honestly don't see that happening.
# Posted By Tony Garcia | 3/13/09 12:43 PM
I'll take the bait (of the "where's the argument?" variety).

I'd argue that if you don't have at least one directory full of "practice" code, just stuff where you're playing around, learning, trying out functions and tags you've never used in your day job, then you have no business playing with another language.

You have more important work to do first, which is to develop a habit of play. If you don't have a habit of play -- if you don't like to tinker and experiment in code -- then your problem isn't language acquisition... your problem is love, or lack thereof.

The pragprog "learn another language" pronouncement is predicated on a love of the thing that happens between you and your machine when you're writing code to bend it to your will. If you're missing that, then learning another language is a waste of your time.

Though I would add a caveat that if you hate your server side language but you'd fall in love with something like Flex... that's a different story. Experimentation would definitely be a Good Thing (tm) if your problem was of the "I love to code, just not in this language" type. But that's the exception, not the rule
# Posted By marc esher | 3/13/09 1:09 PM
Great points overall.

The key point to me in this whole debate is that you should always be learning something new. Whether its a new language, a new tag, a new concept is going to depend on your career stage but regardless just always be learning.
# Posted By Sam Farmer | 3/13/09 1:44 PM
@Sam - yeah, I think the point here is that there is not necessarily any more intrinsic value to learning a new language than to improving your skills within the languages you know. We didn't even touch on the impact of your job, but obviously if you work in a place that has a CF/Flex technology stack, for example, there probably isn't much value in your learning Ruby unless it is something that particularly interests you. You aren't likely to win a battle with your bosses to change the whole stack because you tried RoR and you think its super duper peachy keen. However, getting them to, for example, consider adding some Java or Groovy on some back end processes is an argument you can possibly win.
# Posted By Brian Rinaldi | 3/13/09 2:47 PM
I'm late to this party, but I agree with what I think everyone else here has already said. We need to think in terms of "aspects" or development rather than languages. As Peter was saying, there is Unit Testing, and TDD, and OO, and DI, and all that good stuff - these are all just "Aspects" of development. It is only by coincidence that we learn these aspects in the context of ColdFusion. As long as we keep learning new aspects of development that make use better developers, I don't think it's important what the language is.

Also, if you trust in people like Seth Godin, I think he would say that begin a generalist is not advised; rather, one should try to be the very best at what one does in order to set themselves apart (think ice cream - Chocolate isn't the second best selling flavor by just a little ... it's the second best selling flavor by a HUGE margin.)
# Posted By Ben Nadel | 3/13/09 7:20 PM
I've got just 3 letters to add to this discussion:

SQL

I don't care what language you are currently programming in... if you take whatever spare learning time you have to get as proficient as possible in SQL (and/or TSQL, PSQL ) your value as a developer will go up far quicker than learning any single language. A strong SQL programmer can become a strong php,ruby,cf,python etc developer in a fairly short time.

Data is at the blood of most applications, and SQL is the heart that moves the data.

Gus
# Posted By Gus | 3/13/09 10:41 PM
The problem with suggesting people learn Java alongside CFML is that Java isn't "different enough" for folks to really get new lessons - all it does is make them write their CFML in a more Java-like style which I don't think is helpful.

I've always been an advocate of CFers learning a new language but I've tended to recommend things that are *very* different so you get a new perspective on problem-solving.

My top recommendations are (usually): Smalltalk, Prolog, Haskell.

Yes, from a practical p.o.v. it doesn't really hurt to learn Java (or Groovy) but it doesn't add as much value as really stepping outside the box to "think differently".

Good points about all the general programming best practices that many CFers lack (version control, TDD, etc etc) and those are definitely things to work on as ways to improve your day-to-day work.
# Posted By Sean Corfield | 3/17/09 8:27 PM
@Sean, I *still* have a copy of "the Haskell school of expression" as per your recommendation. Unfortunately, not yet opened :-(

However these days for functional, I'd tend to recommend Scala if only because of the interest in it, the implementation available on the JVM and the fact that it's often held up as an example of "strong typing done right". That said, given I never opened the Haskell book, is there any reason you'd recommend Haskell over Scala as an introduction to functional programming?

I suppose one point would be that Scala isn't as purely functional, as it combines both functional and OO concepts, but if anything I'd suggest that makes it more practical and a little more likely that you'd be able to find use cases in a real project . . .
# Posted By Peter Bell | 3/18/09 10:52 AM
Haskell has a long history and a huge community - and it's purely functional.
# Posted By Sean Corfield | 3/20/09 6:26 PM
BlogCFC was created by Raymond Camden. This blog is running version 5.005.