Finally Sick Of Windows

For along time I’ve been a proponent of Windows, mostly because it has a nice file system navigator and is highly and easily configurable.  For instance, putting several versions of Java, or even a new version of a JDK on a Windows machine is quite simple compared to the major hoops you have to jump through to put it on Mac or Linux.

But the last two newer machines, and my older XP notebook finally pulled the last straw.  WINDOWS IS SLOW.   Plain and simple.  It constantly needs updating, it updates when your turning it off and updates when you are starting it up.  The waiting is excrutiating.

On top of it the current an last places I worked at loaded encryption software on their hard drives; the Mac people didn’t have to face this.  So deploying a WAR file to local Tomcat that takes 30 seconds literally could take 10-12 minutes.

No More Windows for me.

Plus there’s that little mac feature of close the notebook, open the notebook (which also seems to work for Linux) — the usability of an immediate on OS can’t be understated.  And I love it.

We are in a world of a new battle for OS’s.  Android could possibly be the next big OS.  Chrome OS is a great answer to a lightweight featured user OS on lesser hardware.  mac is merging a lot of its OS’s together to solidify user experience.   Asus makes machines with two-second boot buttons running Linux.  So that world, compared to Windows 7, loaded with McAffee and PGP and a thousand UI enhancements I don’t need, sloooow enhancements.  Well for a power user and developer like myself its a no brainer:  No More Windows.

I loaded Ubuntu 11 desktop on this notebook I am typing on; the install accommodated dual-boot very easily.  It’s fast as hell, running solid.   It has nice UX built in.  All my programs, save one, run on it.  I can close it, open it, close it, open it.  What’s not to like?

My next notebook — when they release a quadcore ultra book that can take 8-16 gigs ram — will be running Mac OS or Linux.  I’ve already decided.

 

 

Pondering Poor UX

It’s kind of hard to believe these days that poor user experience that can hinder your website would be developed and deployed.  But it happens — all the time.  Its just a testament to how difficult UX is to understand.

Recently I was on an artificial sweetener website.  I could not, for the life of me, find their products.  Across the top menu  they had “About Us, Lifestyle, Recipes, Community”.   Nothing, NOTHING on the home page to list the products.   I was forced to change a page and scroll down to find a category called “products.”  And it was listed third in that page menu on the left!

The site’s retail home page literally did not have a link to its own product list.

I see this all the time.  Now, while I am no UX expert, I do consider my self an expert use-er.   It means, I know what I want when I go to a site and if I am overly inconvenienced I bail out.

What  causes this?  Having sat on a few of the meetings with people who uh, design this stuff (usually I’m just working on the engine code so I get no say) I observe this:

  • No talent to design.  Serious.  Design is measured subjectively so often, this always slips by.
  • Failure to understand the user.  Usually this manifests itself by the application team using their domain language in meetings, thinking the user knows the same domain language.  They do not.
  • Too complex.  It may be a designer, a pm, or a developer but they want to flex their technical muscle.
  • Failure to understand the mission of the company.  That’s right — what the hell are you trying to do with the site?

There are some ways to get around this, a few solutions:

  • AB testing for your pages.
  • Full blown web analytics.
  • An experienced UX team AND you listen to them.
  • A good set of missions statements/grounding for the project team.

That’s just a few.

These days companies are trying to re-invent the user experience,   Personally I think it fails more often than not.   One redesign I would be curious to see stats on is Target’s new site.  Personally, I think it was a step back, and, it loads very very slow and you have to scroll like a madman on the home page.   I think they were trying to get away from the standard, Amazon, but sorry that pattern is laid down.  People like it, it works.

A site years ago, Campmor, used to have an almost Craig’s-list appearance.  It was unique in that you could drill and filter to products quickly.   They “updated” and made it Web-2-oh-ish.   And I stopped shopping on it; the site was too difficult to navigate and required a ton of clicks; I couldn’t do my visual scans on a ton of say sleeping bags like on the old site.  It became useless.

This is just retail but like well designed clothing, a well designed site is difficult to find.  I find the mobile sites interesting because they FORCE a team to be practical.  Maybe that’s the place to start before trying to predict behaviors that don’t exist.

 

Is X11 the new Flash for Apple?

So on Labor Day I decided to sit back, relax and try out some new fat install wiki software.  I like to use Zim but after messing around with Microsoft One Note which is stupendious I am really dying for something that would let me paste in images without a lot of work.  I looked and settled on vetting KeepNote and RedNotebook.  My requirements:  cross platform local wiki.  Anyone who know me knows I work in the big three environments at any given time: Windows, Linux, Mac  and being an application user, not an OS frek, I like cross platform stuff like Eclipse.  JEdit still hasn’t passed my test, since Notepad++ on Windows and Textmate or ANYTHING ESLE on Mac are superior in performance.

MacPorts Purgatory

So its time to install KeepNote and RedNotebook.    Interestingly enough they are both Python applications, run in X-Windows.  Of course there’s no .dmg for a Mac install. OK, so that means I can install them via Macports.  Simple . . . .

I start the install with a MacPorts selfupdate.  Takes about 20 minutes.  Upon installing the new wikis I get missing python library errors.  Then I get python version errors.  Apparantly python 2.6 is conflicting with 2.7.  One of the wiki instructions says uninstall Fink (another packaging tool for Mac).  Christ.  I do some fixes and now py27-nose won’t load.

As I get farther down the road, i decide to do a full clean and self update for MacPorts.  It takes 3 effin hours to re-download and build everything.  Then I start getting perl errors.  More versioning errors.  So I remove all the perl versions and get the “right” one in, another 45 minutes.  We’re up to about 5 hours of time now.

Perl is good now, I get errors install the GTK libraries.  More dicking around with MacPorts.  Finally, I get an install.  Total time has been 6 hours — but its not over!

8 total hours to update all my libraries to install two python applications on my Mac.  Talk about productivity.

When I fire up the apps X11 pukes, throwing a terminal error.  A couple of Googles later I have update to the latest latest pathc of Snow Leopard and install a special X11 dmg package form the open source site.

Irony

Finally!  They’re running!  A few errors but I can run both KeepNote and RedNotebook.  But guess what?  THEY LOOK AND BEHAVE JUST LIKE FRIGGIN ZIM!!!

That’s right, except for image pasting the icons, everything are just the same Python UI pieces and the applications aren’t even as good as Zim for what I need.  Jeez.

X11=Flash With More Tenacious Developers

You know, I don’t think Steve Jobs wants anyone running X11 applications (like Gimp or my wikis) on a Mac.  Apple is notorious for controlling is UX; for instance the banning of Flash off its iPhone platform.  X11 is an open source project for Mac to run the dang X-Windows apps on the mac, which is basically running over a Next core.    But Jobs, I am guessing, doesn’t want it.  Or whoever is ruling Apple now.

The Modern Developer

Having been in a lot of modern shops and talking/interviewing some olde skool java developers I realized there are some tools that are advantageous to being a modern developer and being more productive.  Here they are:

1.  Own your OWN notebook development computer

You need to own your own because it allows you to spike code and try things out and most importantly the ability to KEEP WORKING even if your work computer is out for the count.

Own your own tools.  Auto mechanics do.  Doctors do.  Artists do.  You should too.

2.  Be Portable

Owning a notebook is a good start; better yet having a work-issued notebook.   You won’t be tied to your cube and you can do presentations and collaborate.

But don’t just stop there.   Reduce the amount of “work stuff” you need so it can all be carried in a single bag.  Practice working in other spots besides your cube, or work next to colleagues trying to establish patterns of productivity.  Sometimes a good set of headphones helps; but the big hump is gettng over that behavioral cube-pattern.

3.  Learn to Use your trackpad

I know a lot of people like to use full sized keyboards/mice but in fact, learning to use a trackpad allows you to be even more portable, light, and also learn gestures which are far more powerful than using a mouse.

4. Get a Smart Phone

For the short-term, minimally, future smart phones will be driving the UX industry.  Again you learn usability and gestures will will improve your development skills and insight as to how users may use the software you work on.

And you are a software developer.  Own the tools of the trade.

Enterprise Hosting At Home

OK that title is a not serious.

At my current gig we need servers; and I’ve been waiting for the bosses to make the deals to get some real server services.  It’s finally happening, but, its real slow — the handshakes, board room stuff all that.  I didn’t want to strap myself to a kluge solution, but since I see the light at the end of the tunnel I went ahead and pulled a solution out.

Here’s the need:  we need a QA server to allow the product owners/business to look at and test the websites we are developing before we deploy them.  Our current solution involves a week on a staging server before production and we do not control the deployments or data or anything.

Our sites are Java/Spring/Hibernate running on Tomcat with Afresco/MySQL.  Services for Java can be pretty expensive and time consuming to set up correctly, and I wasn’t about to pay for it myself.

First Solution spike: Amazon EC2.  It seems like a good solution but the business wouldn’t give me a credit card and some of the “free tier” services run out after a year — and then they start charging.  Plus the 10 gig limit is of no use to us for storage we have a ton of data and media. (Honestly, its expensive to do this for real we spiked our needs and were quite surprised.)

Second Solution spike: Google App Engine.  Nope — waaaaay to limited, good for proof of concept/RAD apps and that’s it (or Python).

Third Solution spike: VMWare.  Easy enough to set up an image but, would have to have business users install VMware and then obtain my 1 gig+ images.   Too complicated.

Fourth Solution spike: Portable Linux.  In the old days you could run a version of Linux in Windows — Damn Small Linux still does this.   But them as you know, you descend into distro hell trying to get everything configured on some weird Linux deployment.  Finally I tried QEMU with and Ubuntu iso — is worked but was sooooooooooo heavy and slow, and again the file izes were massive over a gig easy.

The Solution

I went home and saw a dusty old server tower sitting in the corner and decided that was it — serve it up from home.  I used to do this in the old days with another domain I have, before it became cost effective to have PHP sites hosted (like WordPress).  I used Zone Edit, which maps a static ip/domain name to the  dynamic IP you get from your DSL service provider (or whomever) and had a little daemon software you install on your local home machine (that has no static IP) that syncs the IP addresses should the service change it.

Setup:

  • Set up my server with my apps.  I set them on port 80 — even though Tomcat runs on 8080.  Just easier.
  • Made sure the server’s firewall wasn’t blocking anything.
  • Gave my server an internal static IP (although — could use the DNS server).
  • Opened port 80 on my DSL modem/router for the server’s IP.
  • Created an account at a site called No IP.  You can also still use Zone Edit but No IP has a better daemon software to run. This account maps the dynamic IP my DSL service gives me to a static IP and domain name for free — like “mysite.no-ip.net” or something.  So you have to create that domain, or you can also map an existing name to the static IP they give you (for a fee I think).
  • Installed and configured the No IP daemon on my server (Win/Mac or Linux!!!!)

Testing:

You can’t test inside your network for some modems because they do not allow loopback mapping — for me, if I went to “mysite.no-ip.net” I got the login for my modem on 192.168.0.1.  You need an outside line AND you can put the mapping in your lmhosts file.   In the old days with Zone Edit I used a dial-up Juno account to make sure it was running for real.  But in my case, I just used my Android phone and surfed on the 4g network (make sure you turn off local networking) to make sure the sites were up.

Also I installed TeamViewer on the server, my work machine and the app for my android phone.  TeamViewer (to me) is the next generation of VNC for remote machine access and management.  You have to pay if its for commercial — I’ll be taking the work site proof of concept offline soon — but its free for home/personal use such as the open source Grails things I have been looking to publish.

That’s it, you’re serving up from home, enterprise style.

 

Linux Tip: CPU Utilization – top

I use the top command when I want to see CPU usage and some other CPU stuff.


user@ubuntu:/etc$ top

Reminds me of a text version of the processes view in Windows task manager:


top - 21:56:18 up 1 day, 1:02, 2 users, load average: 1.12, 0.34, 0.25
Tasks: 134 total, 1 running, 133 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.7%us, 4.0%sy, 0.0%ni, 94.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 379840k total, 368436k used, 11404k free, 50188k buffers
Swap: 0k total, 0k used, 0k free, 191652k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
830 root 20 0 89360 15m 6600 S 3.0 4.3 0:43.89 Xorg
8646 user 20 0 46132 12m 9792 S 1.3 3.3 0:04.53 gnome-terminal
1246 root 20 0 5676 2848 2304 S 0.3 0.7 2:29.56 vmtoolsd
8837 user 20 0 2544 1216 928 R 0.3 0.3 0:00.19 top
1 root 20 0 2796 1640 1172 S 0.0 0.4 0:01.33 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.10 events/0
7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuset
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default

It updates itself too. Oh yeah — ctrl-C your way out.

Careful With Your Time There, Code Slinger

So what do you do after paid hours?

Let me guess.  You code up web sites in Fortran on Rails because that’s the best language in the world;  you spend hours and hours at night figuring out the next cool thing for EJB 4 even though you’ve never done EJB before, or maybe you read blog after blog like Slashdot and Joel on Software and forums about Agile because you da man.

Me too.  Just wrote my first Frails plugin that takes dot matrix printer output and converts it to ascii.

No matter what you do, even if its something as meaningless as spending time with your family (remember I am a sarcastic beast), we all share one thing:  it’s OUR free time.  Not the company’s, and no one else’s.

I raise this point because I’ve noticed several times over the years in the industry that a lot of people looking for a code slinger aren’t good willed.  You have to remember:  the world is about sales, and you are a product.  Bottom line.

In the past years I’ve donated tons of time to companies, people, non-profs, and made estimates, code contributions, and set up old hardware to “save a buck.”   But the worst, the WORST thing that happens is when someone willingly misguides you to get free labor and expertise out of you.  And this happens quite a bit.  Us coders aren’t doctors but this is a lot like the free advice giving doctors cringe at.

One time there was a person at my job who wanted “help with a site” and made it sound like they were helping a friend.  Pretty soon they wanted to meet during work of all things to talk about it in meeting rooms, and since they came in early I heard from others this person was working on the site.  I gave about 8 hours then heard they might be billing and not telling me.  And had the audacity to say “I was in it for the money” laying a guilt trip — on a professional hack, um, I mean software engineer.

Imagine.

A few times at jobs I’ve been approached to help people “learn” a technology outside of work or flat out work on their business idea without being told it was that, or being offered partnership.

And how many Big Places want the type of employee that works “for free” — extra overtime because “you love your work”?   This especially has been a piece of contention with me because it literally breaks contracts (hour work for hour pay).

So I have a warning to the younger developers out there:  step lightly when committing your time.  Focus on doing a good job at work, enjoy being the junior and stay away from the time-wolves who want your labor for free.

If you would like a project outside of work, make sure it pays or that’s it has visible assets so you can use it on your resume.   And if you need to learn a new technology don’t leech onto people’s free time, learn it yourself.  Take a look at all the great developers around you and look at Gates and Jobs.   they did it outside the box on their own.  Just keep it in mind, that’s all.

Iterative Death March

I was watching some of my buddies on a project and they have been living in the bowels of hell.  They are on an Iterative Death March project.

A Death March Project classically defined is a nightmarish high risk, huge overtime/grueling work, looming deadline project. Oh, the horror.  You can read about it in wikipedia (Death March)  or in the book that I first remember telling me about this methodology — Death March by Edwartd Yourdon.

Iterative Death March is the agile version, but repeats itself every sprint and for the whole release.  The poor participants are doomed to live in hell over and over week by week with more mission critical deadlines.  It is much much worse than classic Death March technique, like having your head held underwater repeatedly.

I’ve been on a few myself.

The Problem

Iterative Death March is an agile style that is very common today.   If you read my post Agile Steamship Part 1, then you can see some of the causes.  But basically, for a developer, the experience is like this:

  • The project is at mission critical according to some higher-up and time is running out towards the deadline.
  • Hardly any requirements have been fleshed after months, MONTHS, have went by.
  • Technical expertise was never consulted, and there is no cross-team technical vision or architecture.  The same work gets repeated over and over.
  • There are plenty, PLENTY of PM’s who partake in daily blamestorming meetings.  In fact, before the actual work is done the framework for whom to blame (developers) is well architected and set into place.
  • Agile is dropped into place so that developers can be blamed more efficiently.  By making them put their names on tasks, they are now accountable.  But, none of the poor planning and inaction is tracked up to that point.
  • Bodies all over.  Tons of them.  People brought in off of projects.   People with knowledge are reassigned though.  new faces with no domain knowledge are brought in.
  • Due to the bodies the effective people’s productivity is reduce so they can train them, contributing to blown deadlines.
  • Bugs are logged on unfinished software before its released creating a faux backlog of yet more work in the way of actually accomplishing something.
  • Repeat.  Iterate in short sprints.
  • Meeting hell.   Developers never get more than 20 minutes of contiguous time to actually make the software.
  • Weekends, holidays, and evenings bled from peoples’ lives on short notice with the classic huge pre-release work spike common to many poorly executed waterfall projects.  Just on a nice, short time frame.
  • Scope on the agreed sprint work is changed mid-sprint making code bad and work lag even more.  The about face exerted on development efforts for multitasking like that is well documented and results in 30-60% inefficiency, depending on the circumstances (daily interruptions vs. multitasking on several things.
  • Attrition and apathy.
  • Less software.  Poorer quality.  Higher cost.

I have been there.  No thanks.  Al this crap is in the old Mythical man Month book (from 40 years ago) and still there are teams that don’t listen.

My Solution

Alleviating a management team that will do this to developers has made me no friends, because of a lot of reasons, but mostly because there are other forces like promotions and political power struggles going on outside of the project.  Frankly, its annoying.   But it can be alleviated by taking thee steps:

  • Make an accountability trail for everyone, this is the trust framework.  Culturally this is a huge move.   Trackable sharepoint for the BA’s and the PM deliverables WITH tech team signoff.
  • Bring tech leads in at the start
  • Plan to the point of paranoia.
  • Tech team makes a plan to build, and the PM does not control what’s in it at the tech level as long as it lines up with the business stories and the agreed time-boxed schedule.
  • If the dates can’t be hit, don’t hit them.  Nothing in the world is important enough to do a crappy job that does absolutely nothing good for the company while people’s lives are trashed.
  • Smaller, more expert tech strike teams.
  • No new faces during building unless absolutely agreed upon.
  • NO scope changes mid-sprint.   The sprint is an agreed contract between the coordinators (PM’s, business) and the people who know how to build the software (which the PMs and business do not).  Changing scope changes outcome, causes attrition.
  • Ruthless focus on the task at hand.
  • A well planned, sustainable pace.

Last Thoughts

I thought about my buddies on that Iterative Death March team, and some of the other personnel and the business unit and realized that the reason these types of projects come about isn’t because of the project itself, its because of the people.   That’s right — its PEOPLE who create a good or bad atmosphere.  We are the ones who fail or succeed at the planning, or the builds, or the scope management.

And that’s why my best jobs in my career, it was the people who made it great and not the work.  If the people are great the work becomes creative, inventive, and effective.

Hmmm.  Interesting.

 

 

 

Linux Tip: Checking Disk Space – df

If you ever need to check disk space on a Linux system its easy, use the df function:


user@ubuntu:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 20G 4.3G 15G 23% /
none 182M 252K 182M 1% /dev
none 186M 252K 186M 1% /dev/shm
none 186M 196K 186M 1% /var/run
none 186M 0 186M 0% /var/lock
none 186M 0 186M 0% /lib/init/rw
.host:/ 298G 47G 252G 16% /mnt/hgfs

Voila!

New Hard Drive in a Mac

I have an old 2nd-gen MacBook with a core 2 duo processor and ram maxed at 4 gb (although, due to the bus in this, only 3.3 are used).   Running Snow Leopard.  It had a 320 gb 5400 rpm drive so I thought I squeeze some life out of it before I buy a new Windows machine for my Ruby and Android dabblings.

BTW — the old Hitachi drive the machine came with BLEW OUT.  Long time ago, lost data.  Won’t let that happen again.

Here’s how I put the new drive in.

  1. I purchased a new WD 7200 320 gb Scorpio drive off Amazon for $55.  I bought model BEKT  because it does NOT have the atuo-shutdown it it detects a fall — I heard there were some incompatibilities for other models.  Also, I purchased a SATA external drive enclosure for $5; since I would like to use my old drive for a while as mobile storage.
  2. Swap out the old drive for the new drive (after backing up and shutting down).  I do incremental backups with Silverkeeper, BTW — a free LaCie utility.  The drive sits by the battery in this model; the process is the same almost as replacing RAM — three screws and a bracket.
  3. Put the old drive in the new enclosure.
  4. Get your Snow Leopard disk, and start the machine inserting the disk and holding the “C” key down — boot to the CD like you are installing Snow Leopard.
  5. Go through the language screen, then choose “Disk Utility” from the menu at the top (don’t install Snow Leopard!!!).
  6. Important: FORMAT and PARTITION the new disk.  It’s not enough to clone it.  After you are done, exit the Disk Utility and start Snow Leopard Installation (you will stop this though).   If the installation will let you choose your new disk an an installation disk then the format/partition was good (now it is blessed).  I do this because a mere clone-from-backup didn’t seem to set up an MBR properly to mark the disk as a startup disk.
  7. Plug the usb enclosure with your old drive into the machine.
  8. Back out of the installation to the start installation screen — or wherever you can choose “Disk Utility” again — you will see both the new and old drives.
  9. Now, do a “restore from backup.”  Choose the “Untitled partition from the old drive as the source, and the “Untitled” partition from the new drive as the destination.    You can even drag an drop.
  10. Click and run — takes about 1.5 hours for 60 gb’s transfer (in my case) or more.
  11. At the end, confirm the installation by exiting Disk Utility, and seeing if the install will let you choose the new disk as an installation disk — you should still be able to.  Don’t install though.
  12. Disconnect your USB drive, then in the menu choose “Start up Disk” and it should let you choose the new disk.  Proceed with the start up.  You’re done!

The performance improvement was very, very noticeable.  I improved my XBench score from 104 to 131, a 27% performance improvement.

I think this really shows how a higher speed hard drive can really improve performance.  In the future, I am not sure if Mac Users will be able to do this but its certainly a time honored Windows and Unix machine users practice to upgrade their machines.  I am quite happy.