Don’t forget

Tourism.

Work to put websites up for lots of local businesses.  Promote hotels, restaurants, artists, shops, tours, and property.   Once I get income, I can experiment with real estate, and get a house in Cuenca, a house on the beach, and maybe a hotel or hostel.

One small leap

I was reading Gavin King’s spec preview for web beans and started thinking, I should implement something like this in perl or php. Yeah, I know, crazy. I started thinking more about it.

JBoss Seam has a lot of good points. But a lot of baggage that comes from Java frameworks. A lot of that baggage comes from java, from static variable typing, from it’s automatic garbage collector. Reference counting and shared nothing statelessness, or apache MPMs (thinking perl modules, remember for a while, create at leisure, destroy at leisure statefulness) have a lot to say for it (them) in terms of stupid memory management. And I’m stupid.

I started thinking about using Python, because lists are great, remembering GNUEnterprise code that was very clean. But mod_perl beckons. Why can’t there be good Apache Modules. Maybe a master server (Apache) launching a pool of custom python or ruby servers (fastCGI) with application state is the way to go.

Anyway, I started thinking simpler. I know I don’t want to implement a complex J2EE spec. But a few crumbs of goodness would be nice. Like, for instance, a payment handler annotation. Or a data transfer annotation. Admit it, we all love DTOs, because it really is the right way to do things. ORM tools create DTOs, they’re just more complex, slow, and imprecise.

The beauty of Ruby on Rails is in ActiveRecord, but it’s just too inflexible. You end up hand coding anyway, and fighting it and start thinking about designing your DB as a collection of rows of objects. And then start iterating to search. Bad!

But a good DTO can be a poor man’s stored procedure and ORM. But who wants to maintain it. Now, of course a framework to do alot of the heavy lifting, and another one to only load the code you need is nice too, but we can start with a simple annotation. I know this isn’t revolutionary, but what if you added annotations to PHP? A quick search finds I’m not the first to think of this.

Really, DTOs aren’t specifically what I had in mind, but they’d be the most popular, and easiest to implement (naively.) But what got me going was the idea of @RequestScoped, @SessionScoped, @ApplicationScoped, @ConversationScoped (would this be a cross-application transaction) — those would be really nice. A simple include, and annotations, and your PHP Web HaX0r becomes an enterprise developer overnight. And Session scopes can be interchanged.

I know this is the path of madness Java went down, but really, a take it or leave it approach, and keeping it simple could really improve the quality of a lot of PHP code out there.

SCA_SDO looks promising, but too complex, too correct.

And another thing

I actually prefer a unit test to a type system hierarchy. That’s the tester coming out for sure.

If a foo can do something with a object of type bar or baz but not a quux, how do test that:

class Foo
{
//…
public Fooible get() { return lookupAndInstantiate(“object_id”); }
}
class Bar implements Fooible {}
class Baz implements Fooible {}
class Quuz {} //does not implement Fooible

assert(foo.get(id_of_a_bar) instanceof Fooible);
assert(foo.get(id_of_a_baz) instanceof Foobile);
assert(! foo.get(id_of_a_quux) instanceof Foobile);

I want to do this, but my compiler prevents me from testing it. I could cast, but that’d be pointless. I could build an ugly mock that has no point other than to get around the type system, but still not good.

I’m going to score 1 for dynamic languages, because in the real world, you end up getting Quuxes, especially if you want to use something like ActiveRecord; and you’ll write a lot of code to prevent it and a lot of code to get around those compiler checks, otherwise.

A simple junit rant

I’m going to make this very simple. My last junit rant (online — I think on theserverside.com) resulted in a nice email from Cedric Beust about this new thing he was working on called testNG. Oh how I wish I could use it at work. Luckily, that will be an option in 3 days, as I will retire and work for myself full time. JUnit 4 has been a blessing over 3, though dependencies and useful annotations are still sorely missed. @BeforeClass is also mostly verboten, but is allowed in special cases when it shouldn’t be used!

Anyway, this is a very simple rant, though I’m very curious about how I uncovered it.

No assertNotEquals() yet!?!

I’ve wasted time trying to find a rationale. Of course, I have found the junit addons package, but I’m not going to force my employer into that dependency. Maybe I’m missing something, but this is probably the most valid unit test. The likelihood of two things being equal when you expect them to is pretty high, and the likelihood of something being true when you expect it to is even higher. What you really want to know is when something isn’t true (not difficult, even without assertFalse(), which for some reason is religiously implemented) or more especially when two values aren’t equal.

Roundoff errors immediately come to mind, and are an ideal candidate for the architypical unit test. Date handling is another example, and string munging also makes sense. So would image manipulation, though Java isn’t a good language for that.

Anyway, how I came across this, and I’m probably just stupid, is with temperature conversions. Here’s my test that I would expect to fail:

Temperature t = new Temperature(-40.0, ‘F’);
assertEquals(-40.1f, t.convert());

And here’s the code that is being exercised:

public float convert()
{
if (scale == ‘F’) { return 5 * (temp – 32) / 9; }
else if (scale == ‘C’) { return (9 * temp / 5) + 32; }
else { throw new RuntimeException (“unknown temperature scale”);
}

Maybe I’ve spent too much time in scripting languages that do a better job of casting or something. Anyway, it’s not a big issue what’s causing my bug, but I want my test to uncover it.

NOTES:

1 – It looks like there is no assertEquals(float, float.) So it is calling assertEquals(Object, Object). Behind the scenes is it treating them as doubles, integers, or strings?

1.5 – It looks like assertNotSame() will do the trick for this particular case. Is this the answer to checking round off errors? Still, it wouldn’t work on more complex arrangements, or on bit arrays (images), right? I guess it’s fair to write your own assert for comparing images, but surely someone’s done it before.

2 – It also looks like TestNG doesn’t have assertNotEquals either. I’ll probably get another note from Cedric that it was added to and and released yesterday or something.

I admit I was a bit star struck and felt ahead of the curve too that someone with reputation responded to my message. I should start a geek celebrity sighting scrapbook. I still remember when Havoc Pennington responded to an simple question about Metacity code. He dismissed it at the time as a pet project he’d abandoned and then a year or two later it got adopted as Redhat’s default X window manager. I seriously doubt my asinine patch was ever included. But I’ve got (or had) code in docuwiki. I wanted prettier table layouts and hacked a few features into it. I think that was the point I realized that I thought I could really code, submitting a patch and getting it listed on the release notes.

Web hosting and Email VAR

I could enter the email hosting market right now if I know how.
Maybe I should pass it off to Fastmail.fm or Tuffmail.com?
Maybe I should get Exchange running or I mean get a hosted Exchange and then be able to develop apps off of it.

43 things

Top three on the page when I visited:

Travel the World

Learn Spanish

Drink More Water

All three of those are high on my list (okay, I don’t really want to drink more water, just less cokes.) So I must be keeping with the trend. I am so herd instinctive.

Focus

I need to limit my goals.  Last night’s post was good, and I’m glad I reminded myself of the bigger picture this morning.  But the real trick will be learning to pace myself and see what I’m capable of.  I tend to bite off more than I can chew and not follow through.  It’d be nice to have infinite time and resources, but I need to focus.  Saying that, I don’t want to back my self into a corner and just do something simple.  This six months will be an incubator, and after 3, I will decide whether it’s time to monetize or hunker down for a bigger investment.  I won’t make a huge investment in time or money until the 6 months is up.  I might come straight back to Ecuador and throw $20,000 into wages or even get big financing.  Or I might decide to take it easy and brew again.

Office Organization

I see several internal categories of customers applications are developed for, and often the mistake is made of building a product with the wrong user in mind (often management or business intelligence is stressed over accomplishing the work — likely because these are the people with the purse strings.)

An arbitrary set of categories:

Strategic Planning
Management
Product Development
Sales & Marketing
Fulfillment
Services & Support
Accounting
HR
Infrastructure

The CEO and top management need to know the big picture. Summary reports, sales statistics, product development & IT costs, customer satisfaction, profit & loss, etc. but are really outwardly focussed. Their job is to think about potential customers, competitors, investors, and decide where the business should be going. They mostly need reports, I’d argue not even reporting tools beyond spreadsheets, etc. for number crunching comparisons. Tools from all the other departments should make it easy for them to provide strategic data on demand, but I’d argue, not even have a view that a CEO could use. It’s a waste of his time to learn to use it anyway, and he’ll probably mis-interpret the data, or end up micro-managing.

Management tools should be focussed on managing their teams, not on gathering reports for decision making. A manager should not need to know time tracking information beyond that Joe is always late or work, or Judy always goes over budget. Interfacing with HR and Accounting are what they need, because that’s how they work with budgets and employees. Joe should be able to go to his manager about insurance or schedule concerns, and Judy should be able to procure what she needs. Management does need to budget time as well as money, but that’s limited level strategic info, and should be given to them as a report with comments, they shouldn’t be making their own reports or micro-managing their teams’ tasks.

Believe it or not, Product Development is the core of a business. It’s not Sales. Without sales, you couldn’t pay to develop your product, but what is sales selling? It’s what your business does. You make widgets. No one goes to a business saying “I’m looking for someone to sell me something.” Likewise, all the other departments are dependent on product development. These are the “employees” HR cares about. The things that fulfillment is fullfilling, support is supporting, and accounting is counting. Figuring out the *something* to produce is the strategic decision. Producing the product is core. Everything else is details.

Development, QA, and Project Management tools fall in here. It’s why automation is so big in industry. Insuring quality is key to differentiating from competition, and Project Management makes sure you know how these two tasks are going.

Probably the biggest tools market is in Project Management these days, and truth is they’re mostly all bad because they’re geared towards letting managers and executives (and accounting and HR) stick their fingers in the pot and grind the gears of development to a halt.

In the physical world, product development automation has the biggest pay off, and is probably the most mined. Quality Assurance is the hardest to automate, because their job is to make sure the development is done right. And I’m not just saying that because I have a career in QA. I may only know it because I do, but it makes sense — or else I’m blinded by my perspective.

But the better, cheaper, and faster you can verify quality, the better off you are. This is where things like time tracking, budget oversight, and quality control tests come into play. It should be outside of management, partially so management can make dispassionate decisions.

In the recent past, Customer Support was thought to be the big win. There is still a lot of room for improvement, but the truth is, it’s the support that’s lacking, not the tools. Support needs the tools to know about things like inventory, shipping, customer accounts, etc. AND THE POWER TO USE THEM. That’s the part that’s lacking. And the tools are pretty bad, to boot.

Sales consists of two types. Salesmen, and Point of Sale. They are completely different. One is going to customers, the other is handling the customers that come to them. One is trying to convince people, and the other hopes they don’t change their mind, because they are already customers, they just haven’t paid yet. Therefore, Point of Sale personnel need good information on inventory, accounting, fulfillment, and product features. (It wouldn’t hurt if salesmen knew them either, but let’s not expect too much.) Salesmen, however, need to listen to customers, and take back to Strategic planning and product development what the potential customers want. There are two sides to customers relations, and I think this is where a lot of tools fall down. Of course the idea is to cross-sell to existing customers, but that’s changing their mind. Service and Support (perhaps an extension of the point of sale) shouldn’t let a new product poach their customers, unless a strategic decision has been made that it’s worth risking losing existing customers for existing products to try and convert them. Don’t ever think you can have your cake and sell it too. If so, that’s great, but don’t count on it.

Infrastructure, IT (and I’d almost put accounting into this category too), janitorial, whatever keeps the business going. I know it’s an unsung field, but that’s a sign of a good job. The business isn’t about you anymore than it is about sales, but you’re just as important. Sales pays the bills, but you keep the product rolling, and everyone else humming. These tools are usually pretty technical in nature, and truth is, you have to be able to fix when tools break.

HR is mostly a growth of the legal environment. Managers should be able to make decisions, but there is just too much red tape for a manager to handle. The fact is, employees can sue, and so we need you. Gone are the days when accounting cuts paychecks and managers hire and fire. Maybe this isn’t a real category, but it’s a big enough element in most businesses that there are tools targets. People create data, and it’s often very complex. And if you’re not a customer, you’re an employee, and fall under HR’s purview. Departments like HR need to enter data and query it. They can probably get by with a file cabinet, even in the largest organizations (10,000 employee files an inch thick would easily fit into a medium-sized room, and could be retrieved within a couple minutes, if sorted alphabetically.) But this is the computer age. We don’t need the filing cabinet, and Joe doesn’t need to punch a clock, and Judy doesn’t need to fill out her expense reports in triplicate. This is the low hanging fruit. Regulation is the big issue here, but it’s simple forms and databases. What’s really needed are backup and security solutions.

3 more

I will also look at three Open Source Applications I want to support. I’ll concentrate on apps I can host or deploy and provide value-ad. Some potentials to investigate:

OpenRealty
SugarCRM
OrangeHRM
OFBiz
OSCommerce / Zencart
Compiere (ERP)
Alfresco

Software for hardware utilization:

Asterisk (VOIP, PBX, Digium Cards)
EWRT, Portless, etc. (WIFI Routers)
NoCat (Wifi Captive Portal)

I need to look at shopping cart, content management, catalog, order fulfillment, payment processing, fulfillment, shipment tracking, for the typical web site; and accounting/bookkeeping/general ledger, payments received, invoices, shipping and receiving, inventory, paychecks and bill pay, etc. for back office solutions. I need to look at business intelligence and reporting, ERP, CRM, HR, etc. for the front office. Also time, task, product management for productivity (specialize in coming at it from a QA centric approach.)

and 3 commercial apps to support:

1. Microsoft Office (for forms to database and report generation. Template based documents. Alternately look at Outlook applications and plugins. Email based workflow will be huge.

— Also look into Open Office for this. An open office form builder and db/spreadsheet validation back end would be gold. Like creating VB/Access for open office users. It’d be the number one was to drive up usage of that suite.

2. Salesforce.com — There could be good money in this, though it won’t be fun work, I hear it solves a lot of problems for a lot of businesses. Things like SugarCRM may overlap here.

This is probably a sales model I want to emulate with a QA application service. Though I think in house, maybe product management appliances or virtual machines.

I’d also like to see plug an play email server, spam filter, antivirus, etc. appliances or shared hosting. I want it for myself. Network accountability, records compliance, secure document storage and backups, etc. This end of the market may be saturated, but there isn’t good understanding. All I can think of is the Barracuda networks radio ads. Maybe they’re the best, or maybe there’s someone else. Maybe fast-mail has a good service. Maybe there’s an open source (or commercial) solution I could package or recommend & support.
3. Mercury testing tools. LoadRunner, WinRunner, QTP, Test Director. This is always a high demand skillset. Though personally a red flag for a company in my opinion. It’s not typically the type of job I want, but if paying the bills six months of the year is in my future I want to keep my hand in.

I also need to look at the open source and commercial alternatives. Segue (Borland) and Rational (IBM). OpenSTA, TestMaker, Watir/Samie/Pamie/Jiffie/PHP?, Selenium, Canoo, etc.

That’s a lot to do. On top of that I may be spending a lot of time training employees, working with partners, reviewing work, managing, etc. I need to find a revenue stream, but I don’t want to get tied to one too quickly and narrow my focus.

Threes

So there are 4 days left at work. Then I’m on my own. If I want a boat, I’ll do what it takes to get it. If I can. Now it’s time to find out if I can and if I want it.

Maybe what I really want is to run a restaurant/hotel in Ecuador.

Maybe what I want is to make decent money doing QA part time and helping Kelsey volunteer part time.

Maybe it’s to be on a boat, working via an expensive satellite uplink.

Or to run a business creating software solutions.

Or to build houses, or speculate in real estate, or write or paint.

What I really want is to be Robinson Crusoe, more or less, but that doesn’t happen.

So what I’m going to do is follow a business plan, and try to make enough money to do what I want and to make Kelsey happy. Here’s the plan, for the first six months at least:

After walking away from Varolii, I’ll have two weeks to pack and take stuff to my parents in Montana. I’m not going to worry about anything else except to make sure I’ve got a computer that works and that I can get as much done as possible without a network connection.

– And that I can send and receive email.  I think that’s taken care of, at least I don’t want to screw it up any more.

I anticipate up to a month without a reliable network connection, hopefully less. During that time I can probably get by with a flash drive at a cybercafe. But apart from email, some uploads, searches, and a few tools or tutorials downloads, I won’t get much there. I don’t want to have to download a JDK or learn .NET from a cybercafe. In that time I’ll concentrate on what I have.

What will I have? A LAMP environment on Windows Vista, I hope. That’s what I need to concentrate on getting onto in before going. I want to take a serious look at mod_perl + Catalyst, Ruby + Rails, python + turbo gears, and PHP junk. But I won’t have time to read a bunch of tutorials and junk, so I’ll probably just mirror the PHP documentation and prototype on that. I’ll want a JDK + eclipse + netbeans and .NET + all the free versions of SQL server, Visual Studio, etc.

I’ll join O’Reilly Safari and check out some books on PDF. I don’t know if I’ll do the bookshelf (10 books a month at $20) or the library (unlimited books at $40/month.) I’ll take a few books with me (5-10) — it’ll be tough to decide.

I want to spend the first month brainstorming, evaluating technology, and brushing up my skills. We probably won’t have that much time anyway. We need to find a house, establish a routine, visit friends, get adapted to the local microbes, and plan. But I want stuff to keep me busy.

After that, I want to have three short term projects, three services I can offer, three business plans, and three things I can do to help in Ecuador.

I will submit plans to Kelsey, and have weekly status reports and milestone evaluations.

Here are the threes (as currently in my mind):

3 Small Projects:

  1. A new Bugzilla UI
    • AJAX practice
    • ideas for better tool
    • demonstrate web design ability
    • advertise QA experience
  2. A test case authoring tool
    • webapp dev practice
    • crystalize design of test case model
    • advertize dev and QA experience
  3. a gallery application
    • image manipulation practice
    • current and future reuse on websites
    • donleeart and fotos.foxfish.org
    • web service and front end to attract users

3 Web Services:

  1. An image editor (watermarks, resizing, and comments)
  2. QA Tools Provider
    • Bug Tracking
    • Test Authoring, Execution, Results, Reporting
    • Task Management
    • Wiki, Knowledgebase, Collaboration, etc.
  3. Shipping Tracking
    • for DHL resellers (United Shipping)

3 Business Plans

  1. Telecommute
  2. Piecework (through sites like guru.com, referrals, solicitation, etc.)
  3. Product development and sales or service subscriptions.

Okay, that’s not really the three business plans, and I’m out of time. I need to list three specific things I can do that will potentially make money, give timelines, budgets, etc. for the projects. These are the three main strategies.

Telecommute would also include (or could be broken down into) a QA lab, consulting, or offshore style work.

Piecework could also include bespoke applications and COTS (probably open source) customization and/or administration.

Product development could also be application hosting, or could lead to consulting from distribution of open source apps.

I need to work on some clarification here.

3 things I could do in Ecuador:

  1. Teach computer classes
  2. Work at orphanage and with Kelsey’s foundation
  3. Employ or partner with Ecuadorians

I also need to learn Spanish, manage our household, and figure out business stuff (like taxes.)

After three months (by January) I will need to submit a description of my intent on what to focus on, though there will be room for more experimentation. The next three months should be dedicated to one (or at most two) ideas in an effort to complete them.

I’ll either try to monetize an idea, complete a product, or find income.

After the first 6 months, I’ll think bigger. Like hiring people, looking for financing, or setting up a hosting environment for customer.