I’m currently in the process of a renewed effort to become proficient with Clojure. We’ve been using it at World Singles in production for a couple of years now, but there’s been enough CFML that I’ve not really needed to do much in the Clojure beyond very superficial updates. But the CFML is shrinking, the Clojure is growing (well, not really… the Clojure code is much more concise than the CFML code, but you know what I mean), and it’s time for me to fully embrace Clojure.
It’s not that I haven’t tried over the past couple of years. But making the leap from self-taught ColdFusion developer to Clojure and functional programming has been no small task. Functional programming is such a different paradigm that I’ve stumbled over many of the basic concepts. Recently, however, I took a Coursera course on Programming Languages. That’s when the light bulbs started coming on. I had read Clojure books. I had gone to conferences. But sitting down and actually writing out code for the assignments, that’s when it started to click. To be clear, the Coursera course wasn’t Clojure-based. It wasn’t meant to teach any particular language. Rather, it was meant to teach programming concepts. And specifically, functional programming concepts. I started to understand the difference between recursion and iteration. The notion of variable assignments, and in particular, re-assigning a value to a variable, started to make me uneasy. Conceptually, the pieces were falling into place.
Now I’m tasked with fleshing out some code at work that relies on Clojure. Some of it is still CFML written in FW/1, but the meat of it is using the Clojure-based Expectations testing framework. It’s been a challenge, but as with the Coursera course, jumping into the code has proved to be very beneficial. But I still need to hone the Clojure skills in order to work efficiently. Enter 4Clojure.
This is the blog post that’s been rolling around in the back of my head for months, but I haven’t really wanted to write. But as I see others write about it and hear others talk about it, I think that it’s time. Yes, it’s another post on the decline of ColdFusion, but I think from a different perspective. It’s more of an observation of the factors that have contributed to the decline of ColdFusion, almost all of which have been external. In short, the death of ColdFusion is not to be blamed on Adobe, the community, or even on ColdFusion itself. It’s simply a matter of evolution. The evolution of the Web.
I’ll preface this by saying that ColdFusion, along with Allaire, Macromedia, and Adobe, have all been very good to me over the past 15+ years. The platform has earned me a living, put a roof over my head and food on my table. The community has given me friendships that are still strong today, and I would expect will still be strong 20 years from now. I’m eternally grateful for what I have today, and it’s not an exaggeration to say that none of it would be here if it wasn’t for ColdFusion. There are no ulterior motives here. No animosity. Simply my observations.
I do think that ColdFusion is… well, dying. I don’t think there’s anything that can be done. It’s just… time. Others have talked about it recently. Why add to the noise? Because I don’t think a lot of the previous discussions have gone into the *why*s of the decline, and I think that’s important to understand.
Early last year, I blogged about TextMate, which I referred to as my “new IDE of choice”. Embarrassing choice of words really, since TextMate is anything but an IDE. That was primarily what drew me to it. It is a text editor with some extra features, and much more lightweight than a typical IDE. I was happily using TextMate for day-to-day work up until a number of months back when I switched over to ColdFusion Builder 2.
I’ll say up front that I’ve never really been a huge fan of Eclipse in general, which is the framework on which ColdFusion Builder is based. I think it’s a great framework, but it can be quite the resource hog. Yet I started using ColdFusion Builder because my boss used it, and seemed to really be a fan. I figured he knew something I didn’t (which is often the case), and that I just needed to start using it and getting used to it. I was sure that after a few weeks, I’d be over the hump and happily coding away.
It’s been pretty close to a year now, and I still don’t feel comfortable with Builder. It still feels like I’m trying to like it. But it still sucks up quite a bit of RAM, CSS editing is a chore (we have a few _very_ large CSS files that Aptana chokes on), and the keyboard shortcut for commenting a block of code is:
* not intended to be a factual statement
Additionally, some things that I had gotten used to with TextMate weren’t present in Builder. I was used to a closing bracket/curly brace/parentheses being auto-inserted, and me being able to type over that character. But in Builder I kept ending up with 2 closing elements. I eventually turned off the auto-close feature. Long story short… it just never really flowed for me. It never felt “right”.
Over the past few months, we’ve been making a pretty aggressive move towards using Clojure in our model at World Singles. We still have a CFML-based application in a ColdBox framework, but our model has seen a lot of CFML re-written as (fewer lines of) Clojure.
Before anybody asks, or leaps to conclusions, there will be no Helms-ian type blog posts where I bid adieu to the CFML community. Learning and using a new technology does not, and should not automatically equate to closing the door on any other. I’m not learning Clojure to replace CFML. I’m learning Clojure in addition to CFML. CFML will always be a tool in my toolbox. It just won’t be so lonely anymore.
Thanks to Steve Bryant for the inspiration.
Many, many moons ago (1995-ish), I was working for a small startup here in Phoenix doing data entry. The company had a few ventures going on. The cool one was building web sites (for those clients who were bleeding edge enough to know what web sites were), and the other one, which was a CD-based version of the yellow pages. I worked on the other one. Typing the yellow pages into a database.
I had inquired about crossing over to the cool side of the building, but was told that there was no time to train somebody new, and I didn’t know HTML. In fairness, they were somewhat overworked what with keeping up with all of the new cool technology, like the <font> tag.
Log files are an invaluable tool. They are snapshots in time of so many different components of your application and can be, or should be, key elements in debugging and evaluating the overall health of your app. And I’m here to admit that I haven’t relied on them nearly as much as I should have.
For the past few months (yes, months), I’ve had ongoing issues with my local development environment. I would rarely get through a day without having to restart Apache… usually more than once. What would happen is that I’d be working, reloading the site in a browser, and eventually my stylesheets wouldn’t load, or certain images on the page didn’t load. At that point, I knew I’d need to restart Apache. This “fix” worked, but was a band-aid as opposed to an actual cure.
My setup is OS X (10.6.8), Railo 3.2, Tomcat 6.0, and Apache 2.2. My boss was running the exact same setup, pulling from the same Git repository, but was not experiencing the same need to frequently restart Apache. I chalked it up to “something’s not right” (my wisdom knows no bounds), but was content to continue restarting Apache as needed.
Yesterday, my hand was forced.
I’ve recently moved my sites over to a new VPS, with a new CF9 Professional install. This blog has been there for about a month now, and there’s been an issue that I never noticed until today.
There’s a new site that I’ve been working on, and is just about complete. One of the last things I wanted to add was a “dateLastUpdated” column into one of the database tables, which I did this morning. I’m passing ColdFusion’s #now()# value as the dateLastUpdated. I know that it’s generally considered better practice to use a database-specific variable (e.g. getDate() in SQL Server or CURRENT_TIMESTAMP in mySQL), but I didn’t want the column populated when the record was initially created, so I didn’t set it as a default value on the column. I’m using ColdFusion 9′s ORM integration, which I’m new to, so the path of least resistance was for me to just pass now() as the value. It’s not going to be a high-traffic site, so I wasn’t particularly worried about whatever performance implications might result from not “letting the database do the work”.
It should have been straightforward enough, but when I went to test, I noticed that the dateLastUpdated value was 12 hours in the future. I VPN’d into the VPS and verified the system time was correct (same as my local time here in AZ). I recalled that there was a DST bug in a previous JVM, but since the time difference was greater than an hour, I assumed this wasn’t a DST issue. After some googling, I found a post on the Adobe Forums, with a very helpful answer by Paul Hastings (of course… Paul’s very well known for his knowledge of all things i18n/timezone related, and deservedly so).
Since my last entry had a hint of an, “Oh, God, oh, God, we’re all gonna die” overtone to it, I thought perhaps something more upbeat might be in order.
Last month (and I still can’t believe it’s been that long), I was in Los Angeles at Adobe MAX. For the second year in a row, I’ve had the honor of helping Ray Camden and Ezra Parker organize the ColdFusion Unconference. As I spent all of my time at the Unconference, this will be more of a recap of the Unconference rather than MAX itself.
First off, I’d be remiss if I didn’t thank Adobe for their support in helping make sure that all of the Unconferences ran as smoothly as possible. I’m sure that what with organizing MAX proper, their resources were stretched pretty thin to begin with. But we still got whatever we needed and that’s very much appreciated.
Maybe you’ve heard…
Adobe recently published a whitepaper (PDF) comparing ColdFusion Builder and CFEclipse (see Adam Lehman’s post here). Some people were, um… less than enthusiastic about this.
With the full disclaimer that I do not work for Adobe, nor was I even aware of the effort to put this paper together (I didn’t know about it until after it was published… right around the time many others first saw it), I’d like to offer up a response. My response is directed more towards the overall reaction to the paper than to the paper itself. The opinions expressed are mine entirely. And they’re just that. Opinions. Mine. OK, glad we’re clear on that.
you’re like the herpes of the internet, theres 50000000 CF forums and everytime i read a thread going “ah this is the issue i have, i really don’t want to do it this particular way” there you are answering why you should do it like that, very annoying
The above was just IM’d to me by a friend. I think it might actually be a compliment of sorts.
On an unrelated note… sincere apologies for the lack of blog entries (and even more sincere apologies for resuming blogging with this particular entry). Suffice it to say, I’ve been busy, which is a “good thing” ™. I do intend to get back to it, updating everybody with what’s been going on (we moved… again), things I’ve learned about working from home, and of course, ColdFusion.