A Few Thoughts About Various Programming Languages

In my role leading development shops, I am constantly having to learn and evaluate new programming languages and tools in order to keep us current as well as in order to discover better ways to accomplish goals. As a developer, I am also constantly learning simply because I want to get better at what I do, I love what I do, and learning new languages is a fun and rewarding undertaking. From time to time, someone writes a blog entry or gives a conference presentation about the importance of knowing more than one language... of not being a 'one trick pony'. I was reading Sean Corfield's recent blog post about Clojure and realized that I've never written about my recommendations or opinions of various languages that I've used or evaluated... until now. In no particular order, here are several of the technologies that I know and my thoughts about them:
  • Python
    • I've recently been spending a decent amount of time learning and using Python - it's very fast and powerful, and is syntactically one of the most concise and elegant languages I've ever seen... it's VERY readable and the more I use it, the more I like it. Python is definitely one of my favorite languages.
  • Java
    • I've used Java off and on since 1995, and somehow keep ending-up having to use it on projects from time to time. The language has gotten larger, faster, and for the most part, better over the past decade and a half - I found the language improvements in Java 5 particularly useful in that they clearly tried to make it easier to do what you want in your code. That said, I don't find Java programming particularly clever or challenging and on many projects I see, deployment is a terribly painful process. Java applications tend to have ridiculous file/directory structures and I'm not a huge fan of how strict it is. Java is everywhere and does have a huge job market, so it's worth knowing for those reasons... but it would never be my first choice of languages to use based on any merits other than the large talent pool and number of open source projects.
  • PowerShell
    • Powershell is probably the coolest new thing I've seen in a long time. For those of you unfamiliar with it - it's a fully OO scripting environment for Windows (runs on .NET) and is free from Microsoft. The syntax is slick and simple, and the power you can pack into a single line of code makes it a no-brainer for anyone who needs or wants to administer a Windows network or machine. With powershell, windows finally has a shell that's better and more powerful than those available on nix systems. Bottom line: if you use Windows you REALLY should learn Powershell.
  • PHP
    • PHP is yet another free technology - we use PHP and CF for most of our projects, and I like PHP a lot. A long time ago, some people called PHP "poor man's ColdFusion"... well, I think it's more true today than it was back then. It's simple, lightweight, and fast... and development times really aren't much longer than with CFML provided you're not trying to do something that CF does out of the box that there's no PHP module to do. I don't see it having many advantages over CF aside from price, the huge talent pool, and the number of open source projects. There's a good job market for PHP but those jobs don't typically pay as well, so I'd learn it because of it's popularity but I wouldn't choose a career focused exclusively on it.
  • Flex/ActionScript
    • I've used Flex since beta 1, and I enjoy seeing how it evolves with each new release. I don't particularly like programming with ActionScript for the same reasons I don't like Java - but unlike Java, I do love the end result you get with Flex... enough to want to do it. No technology to date that's tried to compete with Flash has been compelling enough to use in lieu. There's also a great job market for Flex - especially here in New York City, and it's one of the top 3 or 4 technologies I'd recommend learning to anyone who wants a successful web development career right now.
  • ColdFusion
    • I've used CF since the beginning and continue to use it heavily. It's not the best performing technology available but it performs well enough for most needs. No, it's not free, but development/debugging time is rapid enough to easily justify the cost. These days, CF's closed architecture and code base is a real turn-off for me personally, but it's the lack of talent (and the poor quality of most "talent") that is it's only solid turn-off from a business perspective. The native support for Flex is probably its most compelling unique feature... that, and it's rapid development nature. It's a good choice when you want a very robust user-friendly platform in a turn-key solution.
  • LISP
    • LISP is, hands down, personally my favorite language. Five or six years ago I set-out to spend 6 months of my free time teaching myself LISP, and I enjoyed it so much that I just never stopped. The syntax took a little getting used to, and emacs takes even longer to get used to - which is probably the most annoying part of learning LISP (I haven't found a better free IDE for LISP yet). LISP is beautiful in the simplicity of its design - most notably in the interchangeable nature of code and data. It is definitely the most expressive and flexible language I've used - as well as the most powerful. Be warned; it takes a while to un-train yourself and learn how to really harness the power of LISP (particularly of macros and, if you're new to it, thinking in functional terms). I also, surprisingly, find the implementation of OOP in LISP (CLOS) much nicer and cleaner than that of any other language. I strongly recommend learning LISP. Not because there's a huge job market for it (there isn't) but because it puts other languages into perspective and because it WILL make you a better developer (I've learned more from 'tinkering' with LISP than any other language).

So, those are the main languages I've played with and developed feelings for recently (within the past 2 years). It's worth noting that there are other languages I left off for brevity. I've also been getting back into JavaScript these days - I have a new appreciation for it's functional nature and closures, and I think JQuery is pretty slick. I've taken a pretty good look at Objective C - it's a decent language but not worth learning unless you want to do a lot of Apple development. I've also played around with Clojure - which is essentially a pseudo-LISP implementation for the JVM - I liked it, but prefer to use 'pure' LISP... though it's attractive being able to write LISPy code that I can run on a JVM, since Java is everywhere. There are a few other languages I haven't had time to take a good enough look at yet but hope to very soon. Specifically, I'm interested in looking at Scala and Caml... and I've begun learning some Haskell and hope to dig into that a little deeper.

My New Business Venture!

The big news that I alluded to in my last entry is that I have resigned from my position as CIO of AboutWeb in order to go into business for myself. I am currently in discussions with several entities regarding funding and partnerships, and hope to have a more detailed announcement in the VERY near future.

Though still an authority and evangelist of ColdFusion, I have also been focusing very heavily on LiveCycle, AJAX, AS3, Flex and AIR (formerly known as Apollo) for quite some time. I expect and hope that my focus will continue to grow with these technologies (always keeping myself grounded with CF - a technology I have long had a love affair with).

I am available to discuss opportunities to consult and engage new clients, so feel free to email me at simon@horwith.com to find out more about how I can assist with your software development and/or training needs. I am also on the lookout for strong talent. More specifically, I am looking for developers with strong experience with one or more of the following technologies: Java, ColdFusion, Flex, ActionScript, LiveCycle, AIR, .NET, and AJAX. More detailed information for more specific needs will be available soon, but if or someone you know fits the bill, send their resume my way. I am also looking for a strong sales/business development person: if you know someone, please let me know.

More information on my new venture coming soon...

No New JRun

Damon Cooper just blogged about the fact that Adobe will do no new feature development for JRun - but the CF server team will continue to enhance the product as need-be in order to suit their needs. You can read the details on his blog at http://www.dcooper.org/blog/client/index.cfm?mode=entry&entry=3172B2FB-4E22-1671-5C9B536E5233786E

Verizon Wireless Wrecks JRun Admin

I recently had to grab a buddy's Verizon Wireless card while my Cingular (sorry, "New ATT") card was on the fritz. A week later I discovered I could no longer access my JRun administrator. Here's the deal:

The Verizon wireless software (created by Venturi) uses port 8000 - the same port that the JRun Admin uses by default. If you want to get around this by changing your JRun Admin port, that's an option. If you want to remove the software - good luck. I had already removed the venturi software from my system using "Add/Remove Programs" but it left a file called "VentC.exe" on my system and it still runs at start-up. This file should be able to be safely deleted, but it's a known bug (that the uninstaller doesn't do a full uninstall) so I suggest first going to the venturi site and downloading the "full uninstaller" at http://venturi.he.net/~venturi/rmventuriall_1_0.exe.

If you don't know your way around DOS, I highly recommend learning it if you're going to use Windows. The way I diagnosed the problem was as follows:

  1. I tried starting JRun admin server from a command prompt ("jrun -start admin" from the JRun bin directory) - I saw in the console that the server wasn't starting because port 8000 was already in use
  2. From a (new) command prompt I typed "netstat -ano | findstr :8000" - this tells me a few bits of information about what applications are using TCP sockets on my machine - the last bit of information it spits out is the process ID. I pipe it to a findstring to only show me the process using port 8000
  3. I then type: tasklist /fi "PID eq 3016" - this tells me some bits of information about the application that is running as a specific process number - in this case process 3016, which was the ID returned in my netstat. Among other information, the console told me that VentC.exe is the executable process I'm looking for
Here's what the commands looked like in my console window when trying to determine what's using port 8000:

Adobe Strengthens Commitment to Flex/AJAX Interoperability

Adobe just released 2 important labs releases that further their commitment to interoperability between Flex and AJAX:

  1. Ajax Data Services library
    A new JavaScript library that lets Ajax developers access the powerful messaging and data management capabilities of the Flex Data Services product directly from JavaScript.
    With this library, companies can integrate application clients built using Ajax technologies with the same back-end data services used by Flex application clients. This means that data from Flex applications can now be automatically synchronized with other Ajax applications, ensuring that both users see the most current, accurate information.
  2. Flex Ajax Bridge (FABridge) update
    Adobe already provides FABridge to allow JavaScript-enabled components to interoperate with Flex-enabled components embedded in the same web page. But as of today, significant updates have been made to FABridge, enabling better interoperability on the client. With the introduction of Ajax Data Services, combined with FABridge, developers can now leverage the full benefits of both the Flex 2 SDK programming model and the powerful Flex Data Services providing full interoperability with existing or new Ajax applications.
The new releases are online at:
Ajax Data Services library
http://labs.adobe.com/wiki/index.php/Ajax_Data_Services
Flex Ajax Bridge (FABridge) update
http://labs.adobe.com/wiki/index.php/Flex-Ajax_Bridge

So You Know ColdFusion - What Next?

For the past couple of years when asked what skill to learn AFTER mastering ColdFusion in order to be more marketable, most CF developers wouldn't hesitate to say 'Java'.
I'm proud to say that for the past 3+ years I've always answered 'Flex'. Many readers of CFDJ were unhappy about my trying to add more Flex and Web 2.0 content in the magazine, so I've stopped pushing the issue... but I've got to say, I still think it's a terrible injustice to not discuss Flex more in CFDJ.

One of the greatest current uses of Flex is for development of Web 2.0 applications. Whether you're into Flex or not, you have to admit that Web 2.0 apps are cool - and I have noticed a growing demand not only for Flex developers but for Web 2.0 developers in general.
The reason I'm writing about this is that ZDNet just released an interesting article about how several of the largest IT companies are about to make major investments in Web 2.0 and about the fact that it's hitting mainstream. The article is available at http://blogs.zdnet.com/Hinchcliffe/?p=79. If you don't believe that the demand for Web 2.0 developers is growing then I strongly suggest reading this article.

To everyone who thought I was crazy for thinking folks should learn Flex several years ago - a big 'I told you so' goes out to you. I'm just teasing, of course... but I'm dead serious about the fact that Web 2.0 will make you more marketable.

Online Diagramming

I've used a lot of different desktop software packages for diagramming software - some I like, some I don't, but most of them are relatively the same. Unfortunately, I've never found a web-based diagramming tool I like... until now.

A coworker recently introduced me to gliffy (http://www.gliffy.com/) - a Flash based online diagramming application that's very simple to use but is pretty robust. Oh, and it's free, too.

AboutWeb and LiveCycle

About a year ago (right around acquisition time) I began taking a look at LiveCycle. Once you've succesfully deployed it on your network and configured everything the way you need to, LiveCycle is a great product. I've also been extremely busy with a ton of client work, so I had two of our sharpest guys - Nic Tunney (http://www.nictunney.com/) and Chris Turner (http://www.cturnerweb.com/) spend a few days with Adobe's experts and spend a lot of their time in the office getting up to speed with the product.

Since then, AboutWeb has launched the LiveCycle portal ( - a resource I highly recommend for anyone trying to learn more about LiveCycle (developers and decision makers). We've also had several succesful LiveCycle consulting/solutions engagements and are continuing to build a great list of satisfied LiveCycle customers to accompany our lists of satisfied CF and Flex customers.

AboutWeb Just Awarded Another Federal Contract!

AboutWeb has just been awarded yet another long term contract with a federal agency here in the Washington, DC area. Everyone knows that DC is like the Garden of Eden for ColdFusion Developers, but I truly am amazed by how fast we are growing.

I'm currently looking to hire 15 ColdFusion developers. Skill level is anywhere from mid to senior level and the positions will be located in Rockville, MD (Metro accessible just outside Washington, DC). These are full time positions working with myself and my esteemed colleagues at AboutWeb. In addition to working with the cream of the crop on several interesting, Enterprise applications, and all the "typical" employment benefits, other benefits at AboutWeb include the opportunity to attend AboutWeb training classes (we're an Adobe Certified Training Partner) including hands-on classes on Flex 2, software architecture with ColdFusion, and Advanced ColdFusion.

Interested candidates should email their resumes immediately to my colleague, Michael Perlstein, at mperlstein@aboutweb.com. Please put "CF Opening" in the subject line of the email for immediate attention.

If you or anyone you know is competent with Java/J2EE, I'm also looking for a handful of J2EE developers (put "J2EE Opening" in the subject line).

Thoughts On Making ColdFusion More Object Oriented

Several folks (Sean Corfield, Ben Forta, Brian Kotek, and Vince Bonfanti to name a few) have been commenting, both here and on their own blogs, about my desire to see constructors, interfaces, and method overloading with CFCs. I thought I'd elaborate a little on each, as well as on the apparently controversial topic of CF being made 'more like Java'. First, to address my reason for each individual feature request:

Constructors
There is one thing that the architect of an application implemented with CF could do if constructors were supported that they cannot do now: enforce that a method, including a parameterized method, is always executed before the object is available for use. I do not think that having a constructor should be required and with method overloading (see below) you could have more than one. However, I'd say that 90% of the development I do is pure CFCs... and every single application I can recall working on (since MX was released) included not one but several CFCs that required that their init() method was run prior to use. Being able to enforce this would make my life easier... and I hazard to guess it'd make a lot of other developers' lives easier as well.

Interfaces
Being able to enforce an object definition - to define a specific method signature(s), is a valuable tool in ColdFusion development for two reasons. First and foremost, I find interfaces to be a very valuable tool when you are the application architect and must be able to hand bare essential template definitions/stubs to the development team. Knocking out the interfaces and handing them over to a team of developers that also understand the domain gives the team a great head start and helps to ensure that objects meet the original architectural plan. I don't feel that ColdFusion really requires multiple inheritance, which is the benefit often cited for using interfaces in other languages, so I'm not particularly interested in seeing the ability to implement multiple interfaces added to CFML. However, I feel that with a single level of implementation and a single level of inheritance, CFCs will be more useful for developers in that they can define the interface for a very generic 'super class', and create child objects (which may or may not have 'subchild' objects) as well as other objects (CFCs) that don't inherit from the base class but also implement the 'super class' interface. In other words, when two objects aren't general-specific (i.e. they're both 'general', don't inherit from each other, have some things in common but the existence of a parent class is unnecessary, interfaces give you a way to enforce some commonality. Even as I write this, I feel as though I've not gotten my point across very well, but I'll move on for the sake of brevity.

Method Overloading
Method overloading is a feature I see less need for than the other two features, and I would caution developers to use it cautiously. That said, there are times when a method could go 'one way or the other' based on the arguments passed, and to have an argument with type 'any' or 'string' and then perform conditional logic is anything but elegant. If nothing else, I could see wanting 2 constructors - one for objects that need to load data when they're instantiated (that has constructor arguments) and one for objects that are 'empty' and require no arguments in order to be constructed. Another scenario might be when you need support more than one external data source schema - argument datatypes may be different depending on which schema is in use.

OK, so that's a bit on the features themselves - now to talk a little about CF being 'more like Java' as others are stating.
First, I don't think CF should be more like Java, and I never said that... but I do think that its support for Object Oriented features should be strengthened. Why? The minute that the CF Server Team released CFMX and gave us CFCs, they introduced the ability to write code in an object oriented manner. They gave us objects, metadata, and inheritance. They gave us the ability to do instance based programming with CFML (without using external COM, CORBA, or Java objects) and they gave us the ability to encapsulate functionality and data in much the same manner that classes allow the same in other (OO) languages. Basically, it already supports doing things in a very Object Oriented manner, so why not support a more full subset of OO features? Writing CFML in an OO manner is already above the heads of the majority of the CF developers out there, and I don't personally believe that introducing overloading, constructors, or interfaces will complicate matters any more than they already are - especially not given the fact that none of these 3 features need be implemented if a developer chooses not to, including when they're using CFCs for 'OO' development exactly as they can do now.

I'm looking forward to seeing the comments on this one...

More Entries

This site is hosted by HostMySite and runs off of BlogCFC - thanks, Ray.