I worked from home on Friday, waiting patiently for the exterminator, who, of course, never showed. It's all very Beckettian, but I digress. The important part: I worked from home, which normally means ordering lunch in to save time and avoid being away from the laptop for too long. However, given the financial situation these days, I've been shamed into being a bit more frugal. So, ordering in is out, cooking in is, well, in.
I decided to roast a chicken leg alongside the season's first batch of brussels sprouts (Yay!). Given this was a celebratory occasion - brussels sprouts being quite possibly my favorite winter vegetable - bacon seemed in order, too. And, since it would be about five minutes' prep work, it fit into my agenda - being continuously available when not in the office so as not to look like a slacker.
Cleaning and trimming the sprouts is pretty quick work. My method is to trim the root off the bottom, which brings most of the outer leaves with it, leaving very little for you to actually peel back. The fresh sprouts smell a bit like raw broccoli - crisply peppery and generally green. I would be lying if I said I don't occasionally nibble on the root trimmings, which squeak and snap between your teeth.
Once roasted or sauteed, though, the sprouts are tender and nutty, and slightly stinky - just like broccoli. (And, just like broccoli, they're terrible when overcooked or boiled beyond recognition - please don't commit this crime against food-manity.) If you like your sprouts well-done, the charred bits are nice and chewy. They go well with anything, in my opinion, but shine brightest when paired with a bit of animal fat, either bacon or schmaltz, and dressed with some balsamic vinegar and a bit of parmesan cheese.
I nestled the chicken leg in the pile of prepped sprouts, sprinkled the lot with olive oil, salt and pepper, and tucked the pan into the oven to roast for about half an hour while I went back to being a responsible employee. My reward: the best lunch I'd had all week, consumed in my pajamas.
Roasted Brussels Sprouts with Balsamic Vinegar and Bacon
1 1/2 tbs. olive oil, divided
2 slices bacon, cut crosswise into 1/2 inch lardons
1/2 pound brussels sprouts, cleaned, trimmed and sliced in half lengthwise
1 tbs. good balsamic vinegar
Salt and pepper
Pre-heat the oven to 400 degrees Fahrenheit.
In a medium skillet, heat 1/2 tbs. of the olive oil over high heat until hot. Reduce heat to medium and add the bacon to the skillet. Saute until the fat rendered and the bacon is slightly crisped. Remove the bacon with a slotted spoon and reserve. Pour all but 1 tsp. of the bacon fat from the pan.
Add the sprouts to the pan and toss in the remaining bacon fat and the remaining tablespoon of oil. Sprinkle with salt and pepper to taste, and place the skillet in the oven. Roast sprouts to desired level of done-ness, about 25 to 30 minutes for me. Remove skillet from the oven and toss the sprouts with the reserved bacon and the balsamic vinegar. Adjust seasonings and serve hot, warm, or at room temperature.
Serves 2.
If you use Firefox for browsing your company intranet sites that are single signon enabled, you must really hate getting redirected to the login page. Ever wished there was a way you could use Firefox without stopping at the login page? Now, there is a way out. Follow these simple steps to enable single signon in [...]
My next step was to switch away from the standard “simpla” theme to another more interesting one. Once again I expected this to be a very easy task but ended up spending hours debugging and troubleshooting Mephisto and my blog setup on HostingRails.com. I started by downloading the theme onto my server:
cd themes/site-1/ mkdir cutline curl http://mephisto-themes.nanorails.com/download?theme =cutline.mephisto-themes.nanorails.com > cutline/cutline.zip cd cutline unzip cutline.zipNow when I logged into the Mephisto console and viewed Design->Manage Themes I saw the new theme. The first problem occurred when I clicked on the new theme and selected “Use Theme." I expected to see the new theme or a message in the admin console, but instead got a page full of text:
$("dialog-box").update("\u003Cdiv id=\"theme-info\" class=\"clearfix\"\u003E\n \u003Ch3\u003E\n Cutline (rhtml) (v1.1)by \u003Ca
href=\"http://cutline.tubetorial.com/\"\u003EPearsonified\u003C/a\u003E\n \u003Ca href=\"#\" id=\"close-dialog\" onclick=\"Dialog.close();
return false;\"\u003Eclose\u003C/a\u003E\n \u003C/h3\u003E\n \u003Cdiv id=\"screenshot\"\u003E\n \u003Cimg
src=\"/admin/themes/preview_for/cutline\" alt=\"Theme preview\" title=\"Cutline (rhtml) (v1.1)\" /\u003E\n \u003Cp\u003EToday, you can put
an end to boring default styling and step into a world where your posts will become more artistic, more engaging, and more
compelling!\u003C/p\u003E\n \u003C/div\u003E\n \u003Cdiv id=\"theme-options\"\u003E\n \u003Cul\u003E\n \u003Cli\u003E\u003Ca
href=\"/admin/themes/change_to/cutline\"\u003EUse theme\u003C/a\u003E\u003C/li\u003E\n \u003Cli\u003E\u003Ca
href=\"/admin/design?theme=cutline\"\u003EEdit theme\u003C/a\u003E\u003C/li\u003E\n \u003Cli\u003E\u003Ca
href=\"/admin/themes/export/cutline\"\u003EDownload theme\u003C/a\u003E\u003C/li\u003E\n \u003Cli\u003E\u003Ca href=\"#\"
onclick=\"if (confirm('Are you sure you wish to delete this theme stored at \\'themes/site-1/cutline\\'?')) { new
Ajax.Request('/admin/themes/destroy/cutline', {asynchronous:true, evalScripts:true, method:'delete'}); }; return false;\"\u003EDelete
theme\u003C/a\u003E\u003C/li\u003E\n \u003C/ul\u003E\n \u003C/div\u003E\n\u003C/div\u003E");
Dialog.current.layout();
It looks like the parent window from the admin console was redirected to “/admin/themes/show/cutline” and the meta data/contents of the theme dialog box intended for some javascript was displayed as plain text to me. After staring at this for a while I started looking for help on the Internet and eventually found an article explaining that I needed to make a code change to app/controllers/admin/themes_controller.rb near line 5:
before_filter :protect_action, :only => [:export, :change_to, :rollback, :import]...should be changed to:
before_filter :protect_action, :only => [:export, :rollback]
One to do item here is to check whether the latest, edge version of Mephisto contains this fix already or not. I’m sure it does. Even after making the change on hostingrails.com I struggled for some more time before realizing that I had to kill any dispatch.fcgi processes running on the server before a code change would take effect. This wasn’t a problem in my local, development setup. Passenger must load and cache Ruby code after the first request. This would be interesting to explore further.
I tried again and this time: success! Finally I was able to switch to the new theme. Excited, I quickly took a look at my new site and saw... nothing! More troubleshooting revealed this error in my production.log file:
SystemExit (Define INLINEDIR or HOME in your environment and try again): ...ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:93:in 'abort' ...ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:93:in 'rootdir' ...ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:107:in 'directory' ...ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:277:in 'so_name' ...ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:317:in 'load_cache' ...ruby/gems/1.8/gems/RubyInline-3.7.0/lib/inline.rb:653:in 'inline' ...ruby/gems/1.8/gems/image_science-1.1.3/lib/image_science.rb:84 ...ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in 'gem_original_require' ...ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in 'require' ...rails/activesupport/lib/active_support/dependencies.rb:496:in 'require' ...rails/activesupport/lib/active_support/dependencies.rb:342:in 'new_constants_in' ...rails/activesupport/lib/active_support/dependencies.rb:496:in 'require' ...plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb:1 ...ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in 'gem_original_require' etc...Some further searching on the Internet revealed that the problem here was that an image library called ImageScience requires something called RubyInline. Looking at the stack trace, it seems that the “attachment_fu” plugin uses the ImageScience library. Probably this is used by Mephisto to produce the thumbnail preview images in the Admin->Assets page. The solution in this case is to create a folder on the server for RubyInline, and to set this value near the top of Mephisto’s environment.rb file. Along with my change from last week to force the production environment, the top of config/environment.rb looks like this:
# Uncomment below to force Rails into production mode when # you don't control web/app server and can't set it the proper way ENV['RAILS_ENV'] ||= 'production' ENV['INLINEDIR'] ||= 'inline'I tried again to see my site, and this time still saw a blank page. View->Source revealed that the Ruby code in the view was not being executed. Finally I installed the “mephisto_erb_templates” plugin as instructed by http://mephisto-themes.nanorails.com/2007/3/21/cutline-theme.
script/plugin install http://svn.nanorails.com/plugins/mephisto_erb_templates/Now the theme worked properly. I made a few cosmetic CSS tweaks, picked my own image and ended up with this page.
I am big - BIG - on sustainability when it comes to, well, all things. But, particularly, when it comes to food. I shop local whenever humanly possible, and I also make every effort to buy from small producers whose ethics and methods I trust.
Therefore, you'd think I'd be a great audience for what Eli Zabar claims is an effort to start a "dialogue" about "the infrastructure that powers a supermarket[...]the perishability, yada yada yada." How is he beginning said dialogue, you ask? By adding a 1.8% fuel surcharge to all purchases at Eli's, his store on Third Avenue.
However, given that the prices at this place are already laughably astronomical ($7.00/pound for heirloom tomatoes that can be had at the Greenmarket for $4 or $5/pound, for example), I'm not inclined to give him the benefit of the doubt here.
This, combined with the experience I had at E.A.T. (his Madison Avenue deli) on Labor Day, seals the deal. I will no longer be patronizing any of Eli Zabar's establishments. In the name of true sustainability (they don't use air conditioning OR heat), I'll stick with the Greenmarket.
Ciao, Eli.
Dawn Foster of Fast Wonder Consulting recently posted a really useful, practical discussion of different types of structures for corporate communities. She puts corporate communities into three categories: emergent, highly structured, and adaptive. Emergent Approach: Community has little or no...
Just got back from Vegas, where I heard C.K. Prahalad (renowned management thinker at University of Michigan) discuss his new book - "the new age of innovation". Enjoyed it!
One of my key take aways was the way he defined and contrasted Best Practices with Next Practices.
We often use the phrase "Best Practices" in IT. I discourage its all purpose use, primarily because of how its interpreted by most... Often it is understood as "here's the gospel, use it, don't question it, just follow it". It doesn't encourage thinking, questioning conventional wisdom. It might be fine in some cases, but not always.
Moreover, there are factors to consider while using Best Practices like context: What worked in a certain situation may not work everywhere; time: What you're facing today is very different from what you/someone else faced a week ago; etc.
Here's what I understand and like to practice...
I blog a lot about the importance of in-the-flow collaboration: the idea that organizations adopt collaborative tools only when those tools are integrated into the flow of daily work. That idea resonates with a lot of readers, but so far...
I've been thinking a lot recently about why my current company seems to have so much trouble working with our offshore development partner in India. Most of the people I work with spend their time thinking about how to work with a bunch of people who are halfway around the world with only a few hours when we're all awake at the same time. The way we've approached the problem is to take about 20% of the developers and temporarily move them to the US to work alongside us while trying to use technology to collaborate as best we can with the remaining developers (conference calls, IM, email and occasional visits of the US staff to India). We have managed to overcome some of the distance and I personally know many of the developers by all these channels and have met a large number in person (in the US and India), but problems still remain.
I know we're not the only company to face these problems (in fact a recent blog by Jay Fields Is Distributed Development Viable is what got me thinking on this topic this week). I agree with most of Jay's post but have been wondering If we solved the distributed development problem ... would the problems I see everyday disappear? I have to say they wouldn't and when I ask myself why I've concluded that our problem has less to do with the geographic distribution issues we face (which are certainly formidable!!) and more to do with the basic fact that most of our developers work for a different company than we do. I think outsourcing seems to be as big if not a bigger problem than offshoring.
What do I mean by that...In my experience successfully developing software is largely dependent on having a team of good people who know each other, have worked together before and are comfortable using their critical thinking and expressing their opinions. I imagine that we decided the rate differential wasn't important and flew the entire India based development team to the US to sit next to us tomorrow. The problem we would still have is that the members of my development team would still work for a different company than I do. My company spends a lot of time helping its employees think about their professional development and how to advance their careers. For our developers at our outsourced partner we do none of that (one of the advantages outsourcing is supposed to grant us the advantage of a bigger pool of resources to use but I believe that we don't need "resources" we need "developers" - sorry to dive into my liberal arts education and deconstructionism a little bit :) With outsourcing we give up on thinking of our developers as individuals and spending time and energy (and money) on their professional development and ensuring that they are challenged and want to continue working with us. The effect is that the average tenure of most of these developers is measured in months instead of years. The problem cuts both ways as the developers have an institutional loyalty to their employer and know they will likely not be working with us for the long term so its very hard for many of them to assume the role of trusted team member who makes decisions for the long term.
What's the solution... I don't know. All I know is that the current situation is very difficult and only focusing on shrinking the geographical distance between the US and India does not seem likely to work.
If you made it hear thanks for reading, I needed to get this off my chest. I hope to get back to more technical topics with my next post!
I've been thinking a lot recently about why my current company seems to have so much trouble working with our offshore development partner in India. Most of the people I work with spend their time thinking about how to work with a bunch of people who are halfway around the world with only a few hours when we're all awake at the same time. The way we've approached the problem is to take about 20% of the developers and temporarily move them to the US to work alongside us while trying to use technology to collaborate as best we can with the remaining developers (conference calls, IM, email and occasional visits of the US staff to India). We have managed to overcome some of the distance and I personally know many of the developers by all these channels and have met a large number in person (in the US and India), but problems still remain.
I know we're not the only company to face these problems (in fact a recent blog by Jay Fields Is Distributed Development Viable is what got me thinking on this topic this week). I agree with most of Jay's post but have been wondering If we solved the distributed development problem ... would the problems I see everyday disappear? I have to say they wouldn't and when I ask myself why I've concluded that our problem has less to do with the geographic distribution issues we face (which are certainly formidable!!) and more to do with the basic fact that most of our developers work for a different company than we do. I think outsourcing seems to be as big if not a bigger problem than offshoring.
What do I mean by that...In my experience successfully developing software is largely dependent on having a team of good people who know each other, have worked together before and are comfortable using their critical thinking and expressing their opinions. I imagine that we decided the rate differential wasn't important and flew the entire India based development team to the US to sit next to us tomorrow. The problem we would still have is that the members of my development team would still work for a different company than I do. My company spends a lot of time helping its employees think about their professional development and how to advance their careers. For our developers at our outsourced partner we do none of that (one of the advantages outsourcing is supposed to grant us the advantage of a bigger pool of resources to use but I believe that we don't need "resources" we need "developers" - sorry to dive into my liberal arts education and deconstructionism a little bit :) With outsourcing we give up on thinking of our developers as individuals and spending time and energy (and money) on their professional development and ensuring that they are challenged and want to continue working with us. The effect is that the average tenure of most of these developers is measured in months instead of years. The problem cuts both ways as the developers have an institutional loyalty to their employer and know they will likely not be working with us for the long term so its very hard for many of them to assume the role of trusted team member who makes decisions for the long term.
What's the solution... I don't know. All I know is that the current situation is very difficult and only focusing on shrinking the geographical distance between the US and India does not seem likely to work.
If you made it hear thanks for reading, I needed to get this off my chest. I hope to get back to more technical topics with my next post!
Today, I completed the book "The Google Story". The book is really good and gives an insight how amazing the Google is. Google founders, Sergey Brin and Larry Page have authoritatively demonstrated the power of innovation and technology.
I switched to SAP.
We introduced Ruby/LAMP in 2008 to develop applications. In our experience, Ruby provides significant developer productivity gains. However, several questions have been raised in IT as we've been a Java/J2EE shop for several years.
How do you measure offshoring effectiveness?
Do you compare only out-of-pocket expenses while comparing offshore and onshore software development options? If so, read ahead...
This method seems flawed when you consider the whole equation i.e. FTE costs + intangible costs like collaboration and quality...
Let's assume a 3 month project (~ 500 hours); $100/hour FTE cost; $125/hour onshore engineer; $35/hour offshore engineer
Many engineers I talk to hate the enterprise. They crave for start-ups... their environment, their fun, their energy, their perks. They find enterprises boring... and why not... that's exactly what most of them are!
How can enterprises address this?
I'll be in Bangalore in November and I'm looking forward to attending Ignite Bangalore on Novemeber 13th. It'll be great to meet some of the technology leaders in India's Silicon Valley.
If you have a lightening talk, submit your presentation topic.
If you want to attend, just show up.
This week a couple of customers I've been working with are unveiling their new corporate intranets...on Socialtext. What's interesting about both customer is that they didn't set out to replace their intranets. Originally, they were looking for knowledge management systems,...
Ever since Michael Pollan scared the crap out of me with The Omnivore's Dilemma, I've been a bit corn-shy. Corn, Pollan revealed, is the backbone of our industrial food complex, and is the primary ingredient in many, many more foods than you had ever imagined. It represents the most evil elements of our mechanization of the food chain, and it's just bad, bad, bad.
Of course, Pollan does not think we should stop eating corn in its purer forms - right off the cob, for instance. He's far more reasonable than that. But for months after I read the book, I was terrified of buying and eating corn, panicking that I was feeding into a system I had no interest in supporting. Then I realized that I still eat Cheetos (king of hyper-processed corn and erstaz cheese) when I'm hungover, and decided it was time to buy and eat some sweet corn, particularly since it happens to be in season.
When I approached the Migliorelli stand at the Union Square Greenmarket, I noticed they'd posted a sign: "No husking." Really? I was always taught to husk an ear of corn, just barely, to double-check that the cob was, in fact, intact and free of blemishes. First, you check that it's heavy for its size (indicating juiciness), then you pull back the husk just a tad. Rule-follower though I typically I am, I rebelled and husked my ears, rejecting only one out of six (it had no kernels on the top inch of the cob - not a good sign).
I brought the corn home and, once all the groceries were put away, the time came to cook it. One problem: I had never shucked corn inside. Ever. Growing up in Connecticut, land of patios and porches, corn shucking was an outdoor ritual. It seems wrong to shuck corn anywhere but the the back steps, holding the cob over a paper grocery bag big enough to catch all the silk. I stood at my tiny counter for a minute, seriously contemplated climbing out onto the fire escape, and then decided to just give indoor shucking a shot. Let's just say there was a fair bit of clean up involved, despite my best efforts to aim for the bag.
Next, I brought a pot of (unsalted - salt makes the corn tough) water to boil and added the freshly shucked cobs to it, removing them a few moments later when they had begun to smell of - you guessed it - corn. Unscientific, I know, but it works. I cooked five ears - clearly too many to eat in one sitting. I set four ears aside to cool and use later in the week.
The fifth I rubbed with butter, sprinkled with salt and pepper, and ate, standing up, in my kitchen. The butter ran down my chin, the corn got stuck in my teeth (This, I remembered, was why my grandfather always cut his off the cob.), and I generally made a mess of myself.
It was lovely.
I've exercised and noticed different practices in design and writing code... Sometimes we've spent weeks creating blueprints (so 2001) before starting actual development. At other times we've jumped into code directly (prototypes typically) and designed while writing code. There's also the hybrid approach of writing code and designing at the same time - emerging design.
Depending on the case, all practices were legitimate and useful. How should one decide what to do when?
What do you practice?
The National Computing Centre in the U.K. has posted an interesting article by Martin White on Achieving effective Enterprise 2.0 adoption. The center of the article is a list, developed by INSEAD's Morton Hansen, of 10 statements to diagnose an...
I recently got a chance to vacation at Goa and Lonavla. I have posted a few pictures of the trips here. It was amazing to see natural beauty of these places. Goa is well known around the world for its beautiful beaches. We visited about 4-5 different beaches over the course of 2 days. Unfortunately, the [...]
In the past I’ve setup blog sites using B2Evolution, WordPress and other PHP frameworks and had no trouble at all. Last week I setup this web site using Mephisto on a Rails hosting service (hostingrails.com), and expected to get it up and running in just a few minutes; after all, if installing and configuring a PHP blog site in 2005 was easy, certainly doing the same in 2008 with better technology (Rails) should be even easier.
Wrong!
First I created a MySQL database on my production server and called it “mephisto”. Then I set the char set and collation settings using the command line:
# mysql -u myusername -p mysql> ALTER DATABASE mydatabasename DEFAULT CHARACTER SET utf8 COLLATE utf8unicodeci
Since I’m not ready to write my own Rails blog site, I decided to download and setup the latest version of Mephisto (0.8 “Drax”). When I tried to download the TAR file from the 0.8 Drax link using curl I got HTML that redirected me to a different location:
# cat master.tar.gz <html><body>You are being <a href="http://github.com/tarballs/technoweenie- mephisto-90e2cc253d94e2e544bc8b21f361c7360c1e9baa.tar.gz">redirected</a>.</body></html>
Probably this is standard behavior by github and I should have used that directly. I need to stop thinking like a PHP developer! Regardless, it wasn’t much trouble to download the actual Mephisto TAR file:
# curl -O http://github.com/tarballs/ technoweenie-mephisto-90e2cc253d94e2e544bc8b21f361c7360c1e9baa.tar.gz # tar xvf technoweenie-mephisto-90e2cc253d94e2e544bc8b21f361c7360c1e9baa.tar.gz # mv technoweenie-mephisto-90e2cc253d94e2e544bc8b21f361c7360c1e9baa mephisto
No big deal; so far this was a very similar experience to setting up a PHP web site: create the database, download the code and you’re almost done. Next, I entered the proper values in database.yml and tried to initialize the database:
# rake db:bootstrap RAILS_ENV=production (in /home/myusername/mephisto) Your config/boot.rb is outdated: Run "rake rails:update".
It was at this point that my problems started. First I wasn’t sure why I received this error message at all. Next I tried to use rails:update to fix it as instructed and ran into further trouble. A couple of hours and 5 or 10 blog posts later I discovered the solution here in this great write up. It turns out that Mephisto 0.8 does not work with Rails 2.1 and I needed to downgrade to Rails 2.0.2. Since I’m using a shared server on hostingrails.com I used rails:freeze:edge to get the proper version of Rails installed in my app’s folder:
# rake rails:freeze:edge RELEASE=2.0.2 Downloading Rails from http://dev.rubyonrails.org/archives/rails_2.0.2.zip Unpacking Rails Updating current scripts, javascripts, and configuration settings
At this point I tried to initialize the database again but this time got a different error:
# rake db:bootstrap RAILS_ENV=production (in /home/myusername/mephisto) rake aborted! undefined method 'install_gem_spec_stubs' for #<Rails::Initializer:0xb7c652e8>
As explained here, I still had to manually copy one file from Rails to my application which rails:freeze:edge didn’t handle properly, using this command from my app's folder:
# cp vendor/rails/railties/environments/boot.rb config/boot.rb
Finally I was able to run rake db:bootstrap successfully! The last bit of configuration I had to do was to add this line to config/environment.rb in order to insure hostingrails.com used the production configuration:
# Uncomment below to force Rails into production mode when # you don't control web/app server and can't set it the proper way ENV['RAILS_ENV'] ||= 'production'
After creating a symlink and doing some other standard configuration for hostingrails.com, I was finally able to get my site up and running. It was a lot harder than configuring a PHP site and ruined a whole evening, but in the end wasn’t all that bad.
What's the relationship between a document management system (DMS) and an enterprise collaboration suite like Socialtext? The other week, I was meeting with a project team at a large retail bank who is bringing Socialtext into their organization. It was...
We've struggled to find a team file sharing application that supports:
Some Scrum teams have suggested that their Scrum Master doesn't add much value in the project... that their primary function is to communicate upwards/outwards by polling team members for updates... that they are chickens on the projects, not pigs*.
Such team dynamics sounds dangerous and should be avoided... Will the following help?
Let a team member take up the Scrum Master role - whether its the BA, Tech Lead, Developer or Tester in the team. It can even be rotated among them. Scrum Masters are pigs then and are close to the project to know/coach/communicate well... This would help keep the Scrum teams small and effective!
For this to happen, the following needs to be true though:
Trapped in a confusion
I live kindda hibernamted life
Just looking, listening at things
And not doing a single thing.
Knowing all is a problem in itself
And wats more!! I know that I know it all..
And still here I am
Mere spectator of the world around me
And so less a part of it..
I wonder what will make me change
What it will be that will make me change
Or more, if ever there will be anything that will make me change
I wonder..I think.. and still all this time..
I remain just the same..
Software development is a social process and needs synergistic interaction within the team and with the business decision maker as well. I've noticed the following factors affecting our development team's effectiveness -
Drupal is a very popular Content Management System (CMS) developed using PHP. It’s a great way to get an interactive, community web site such as a blog or discussion forum up and running quickly without writing any code. But Drupal is a poor choice for general, complex web application development for a few simple reasons:
A better choice for more general or complex web development would be Ruby on Rails.
If you do need to develop a custom web application using the Drupal framework, you can avoid problems #2 and #3 by using a test driven approach. Instead of simply implementing your custom logic by writing PHP code to the Drupal module API, try pulling your custom code out of Drupal entirely and running it independently of the framework. This will insure that your custom code could someday be run with another web framework and also help you avoid the temptation of modifying Drupal’s core code directly. Of course, you will also get all of the normal benefits of TDD: better design oriented around business requirements, live documentation through executable code, etc.
How to do this? Write tests first using PHPUnit (which fail), then get your tests to pass by implementing the desired behavior using PHP 5 objected oriented code. Lastly, write a “shell” module that calls out to your test driven object oriented PHP code from Drupal. This means your code will be run twice: once from the command line by PHPUnit during development and from your CI process, and again from Drupal to process end user requests in production.
In a series of future posts I'll write a Drupal module using TDD, using a few tips and tricks along the way to get PHPUnit and Drupal to play together nicely.
Business Week just published a must-read article called "The Knowledge Handoff: How corporations are scrambling to tap the expertise of baby boomers before they retire." I'm really glad to see this story being picked up. Many of the companies I...
No, really. That salad - a little grilled chicken, a pile of mixed greens, and an admittedly tasty vinaigrette. OK, ok, there were also a Diet Coke ($4.00) and a cup of coffee ($3.50). Total bill, including an ill-deserved tip (I'm terrified of ending up in bad-tippers' hell.): thirty-seven buckaroos.
The place: E.A.T., Eli Zabar's delicatessen at 80th and Madison. The time: 2:30 PM. The date: Labor Day, 2008. The victim: my credit card. I suppose I should have known better, having been subject to Eli's penchant for overpricing everything he sells at his eponymous Eli's Manhattan. But I didn't realize just how bad it could get.
I suppose this is how he pays for the Madison Avenue storefront. I'm not one for penny-pinching, but given how much I paid for the damn salad, the way they whisked my coffee away before I was done with it was a bit unwise. Never take away a poor woman's caffeine.