I'm sure anyone who's ever found themselves designing or building anything will, in a spasmodic moment of perceived brilliance will come up with something that you later look back on with a feeling of "What the hell was I smoking???"
Moments like these can come at the most unexpected of times... Usually when you're starting to get on a roll... and you're confidence is building because everything seems to be magically falling into place.
My moment of insane idiocy came when I was closing out some of the smaller design components of the Customer Namespace and things in my mind just seemed to be clicking together. Arrogance began to build as I started thinking - "Hey - I'm gonna knock customer out quicker than I think..."
I've often wondered if it's that combo platter of previous confidence based in accomplishment that raises the blinders to your design mantra:
KEEP IT SIMPLE STUPID!!!!
The irony of Customer Contact was that it's a very small simple component, but it would require possibly some management on the users part...
I can also tell, in retrospect, where I jumped the rails...
A customer can have a contact, and a location can have a contact... but what if the customer doesn't have a contact???
One other added piece of self inflicted wounding was the fact that I had talked myself out of building a "Contact" namespace to rolodex all the contacts that could be involved in the system. At the time - I really thought I was "Keeping It Simple Stupid" when I just said "Oh - just build a Customer Contact and store that crap there... don't over complicate it..."
With these two pieces in place... I set about building CustomerContact... and that's when awesome progress turned into quagmire...
First I kept fighting with just the maintenance of the Customer Contact... providing order of importance (first contact, second contact, etc) and making sure there couldn't be duplicates... etc...
Then I fought with "How do you put a Contact on Customer with no location???"
I then thought... OOOOOOOHHHH - I can just make CustomerContact hierarchal !!! That solves the "order" problem, and I'll allow location to be null... Oh man I am SOOOO CLEVER!!!!
This is what it would have looked like:
While in reality - this isn't that overly complicated... it added a level of complexity to something that didn't need it...
What made me realize it was when I took a break from mapping out the logic, and decided... what would the Customer Management Form look like...
In working with the Node Tree... it became clear... and simple:
A Customer can't have a Contact without Location...
A Contact could exist on one or more Locations
A simple "Order By" field is a lot easier to maintain and code than Parent / Child...
Once those three facts entered my head... I scrapped my Customer Contact design, and pumped out the new one in 10 minutes... Embarrassingly after a couple hours of being "clever"...
Lesson Relearned: When in doubt... Draw it Out!!! See if it still makes sense in the context of the larger picture...
The upside to Rabbit Holes: There's usually cake and punch at the bottom once you're done tumbling down...
Saturday, February 15, 2014
Tuesday, February 11, 2014
To Be Or Not To Be… Open Source
One of the bigger intellectual challenges I’ve faced in
doing this project was whether I should do this as an open source project, or
keep it proprietary.
There is an abundance of both in the marketplace, but in the
limited world of logistics, almost none in the open source arena and of the 4
or 5 I saw, none even approaching what I consider the level of maturity or
design I’m going for.
The irony in this is it actually inspired me to sally forth,
because I saw a void that needed filled… and if I could model myself after
something like SugarCRM, then that would be pretty cool, and it might help fill
in the void of development and cash resources to hire resources.
The thing is, when you look at the example I’m modeling
after, you can see even they are starting to move away somewhat from the open
source model. Recently they announced
that they were taking their code in house, and the open sourced version has
been now forked to SuiteCRM (see: http://en.wikipedia.org/wiki/SugarCRM
)
The driving thought in my mind has been this… I want to get
this built, and I have three paths before me because I’m relatively cash poor:
·
Just plug away… in my dark little corner of the
world, and work on it until at least the core framework is done. Then post it up on CodePlex (because I’m
going down the .Net Stack), and see what happens while I continue forward on
developing the system.
·
Just plug away +… Same as above, but as things
mature, count the measure of my life by seeing how many willing friends I have
with tech ability to help me pull it together… still open source, but with more
resources… frees me up to start building / marketing a cloud based stack where
we can host the platform for a fee, and grass roots the start up capital.
·
Financing… I’ve actually worked this through a
number of times, and while I can come up with rosy numbers, target markets
(small to medium transporters), I look at the numbers and it’s hard for me to
believe anyone with money would see the returns as large enough to warrant
investment in time and developers to build the framework. The biggest argument against: Don’t really see anyone beating down the door
for this – and it’s relatively boutique market… translation – No big returns…
It’s partly because of the last one that I favor going down
the open source route. Show the bastards
there is a demand for a quality logistics application that can be customized to
their business. Build a business against
the framework by hosting and providing service and consultancy, and try to
leverage the power of large numbers to identify and resolve issues.
At then end of the day though – the bastards may have a
point… it is a boutique arena… and while I’m largely doing this for the fun of
it (sick I know), and to finally purge the concept from my head (it’s been
buzzing for years – time to put up or shut up J
) – my other reasons for doing it is to make an income doing something I’m
passionate about.
I mean – what’s so wrong with wanting to make money? Money has never been the goal, but what money
can do has been. I want to write my Sci
Fi epic, I want to make movies, help other people be creative and inventive and
all of these things require the same thing…
And it’s not good intentions…
It’s money… it’s what enables you to pursue those things
that interest you. It’s that motivational
lubricant that get things moving forward.
So – the real dilemma is:
·
Risk a level of monetization by making it open
source or keep it proprietary and potentially never get it built…
Once I put it that way… the answer, after all these years ,is
simple…
- Finish building the core framework (working services, application interface, and deployment model), and post that out under an open source license…
- Then later – as the business grows and takes off, let someone fork off the last open version of it and bring it in house so we can lock customers into long term recurring service contracts…
Sometimes the douche bag way of doing things is the only way
to go… Thanks SugarCRM J
Introduction To My Madness (Or 1 of the 2 Things I Want To Do Before I'm Dead)
Hello!!!
If you’re reading this, odds are you’re one of the 5 people
I sent the development website to… but if you aren’t – Welcome. This may become the rantings of a madman, but
maybe not, because I started writing this to keep myself sane as I pass through
the loneliest part of designing a large system…
Designing the System…
Especially at the beginning… it’s extremely lonely because
you can’t / don’t want to bring that many people in. There are many reasons for it:
·
It’s your crazy idea, and you don’t know anyone
else who thinks it’s a good idea.
·
Therefore you have lack of commitment or
enthusiasm.
·
You can’t blame them, because at this phase of a
design… it’s very much vaporware and in your head. Hard to contribute – when you don’t know the
big picture.
·
And it’s sometimes easier to just lay out the
whole picture before you invite criticism (constructive and destructive).
And by easier, I really mean in terms of inviting people in
to help or offer advice. It’s not easy
though to get a big idea out. It’s
mental pregnancy and you only have 10 little digits to get something out that
has gestated for over 10 years.
This system has been brewing in my head since 1997, when I
last worked at a trucking company. There
I went through all the pains and agony of helping that company move from a
homegrown system to an off the shelf system.
I had fortunately great experience going into that project:
·
I had already worked in programming for 3 years,
working ironically on a mainframe, and the first iteration of VB… yes VB 1.0…
and QuickBasic and Business Basic… as well as the VeriFone credit card
programming language TCL…
·
My start with the trucking company was as a
company OTR driver. During that whole
time, I kept thinking of ways to get computers into trucks… and something
better than the emerging satellite systems of the time.
·
I eventually worked in the Fleet Maintenance
part of the business, trying my best there to automate their processes…
·
Got the notice of the management who then wanted
me to learn the rest of the business so I learned dispatch and freight
coordination.
·
Then I was asked – Wanna go into Marketing or
IT? While that may have seemed an odd
question, their marketing guy was a very sharp IT guy with a marketing
background. Also knew EDI extremely well
and had been a leading force in using EDI to help grow a major portion of the
company.
·
But Marketing sounded evil to me (Dad was a
salesman – and I have Daddy issues). So –
I chose IT… which is where I thought I was heading anyway…
From that point on, I became lead on getting the new system
implemented. And it was a train wreck
for a number of reasons…
·
The system was originally designed for LTL
(Less Than Truckload), and we were applying it to a longhaul fleet. (I am to later learn in life when dealing
with AS/400 platforms… this was the norm… Telecom LD systems retrofitted to
handle Local… Local systems retrofitted to handle LD… Either of those kluge systems adjusted to
handle services outside telecom… for another blog)
·
Because of our “EDI / Marketing” guy… we had “non-standard”
versions of EDI with our two largest customers (and they were VERY LARGE
Fortune 500 Companies). The software
company was not prepared to handle this huge variance, and because EDI
constituted 80% of our business… we were in trouble.
Eventually we worked through the reconfiguration and
training (which is how we solved the LTL vs LH incompatibilities). That was the easy part… which in retrospect –was
not that easy.
Solving the EDI issue was the grand mal. It eventually got so bad, that the marketing
guy was no longer allowed to talk to the software company because he threatened
to blow their place up… it was a little extreme, but also clear was that they
weren’t getting the message we were sending them:
We can’t
move to your standards
You will have to modify your
software to handle our standards because this is where the standard was heading
(EDI guy held a prominent position on the EDI Standards Board.)
If you don’t – our business will be
destroyed… and that’s not figuratively…
In a role that I would fall into often early into my career,
I was sent to the software company to soothe things over and resolve the
issue. I was also told – don’t bother
coming back if you can’t because there won’t be any place to come back to…
(I’m only 24 at this point in my life… yeeeeehaaaaa!!!!)
I flew to the software company, and my company provided me a
company car… which was Semi Truck, which I would arrive early and park
obnoxiously close to the front door so they would know I was there. Actually – that’s what I was told to do – and
I loved the idea.
We would finally resolve the issue after many long nights,
and working with their lead architect to show him – let us help you design for
your next roadmap release for EDI. We
just need to do it now.
I was able to return back to the trucking company the hero
of sorts, and there waiting for me was the actually start up… in which I didn’t
sleep for 3 days… (I remember trying to fall asleep, and was afraid if I did… I
wouldn’t wake up).
Thankfully – as mentioned before – I was only 24…
After finally getting this system up and running, I couldn’t
help but be disappointed by it. It
certainly felt like we had spent a lot of money for something that didn’t quite
fit our needs. It wasn’t bad, a number
of other companies used it, but it just didn’t quite work right.
It got even trickier once we installed satellites into the
trucks. It literally locked up the
system in that the system required the driver to report their status, and if
they or the dispatchers screwed something up… you couldn’t re-dispatch the
driver, or move the trailer if had been dropped, but not reported – there was
no way to update it’s location.
Like everything else –we found ways around these issues, but
these issues stuck in my head… and as I gained experience with other systems,
and other design paradigms, I kept thinking – I could totally do that better…
And – if I ever decided to start my own trucking company –
what would I want to run my business on.
Obviously – since 1997, systems, processors, languages,
databases, communications have all increased easily a hundred fold.
But I still haven’t seen a design I like. My experience instilled me with the following
wants (in no particular order and not a full list):
·
A Full Functional In Cab Computer for the driver
with weather maps, routing (with intelligence to avoid hazards like low bridges),
GPS reporting, and integration to Logistics System to provide automated cash
advances, signature capture, Over/Short/Damage Claims reporting, pick and
choose dispatching, or automated dispatching.
·
A Fleet Maintenance System that can support not
only in house repairs, but inventory, off site repairs, provide a directory for
authorized repair centers, warranty tracking.
Again – I also see tablets involved to resolve repair orders, etc
·
A logistics system that can eliminate the mounds
of reports, and flat screens of data, and improve the efficiency of the users
by visually displaying the status of the area they are working on. GIS would be a big part of this picture. This came from my own experience learning
freight management and feeling completely worn out before noon just trying to
get loads set up for drivers coming into a dispatch area… Seeing them visually on a map would tell me –
ok – he’s gonna be on time – I can get him a load set up – and promise the
customer we can pick it up. That’s the
magic of Freight Coordination – keeping drivers and assets moving, and keep
promises made to the customer…
My final want, which was mainly inspired by working with
systems designed for one business model, but applied to a completely different,
is to have a system we can easily configure to a transportation business model. Any business model.
I want to be able to support:
·
LTL
·
Long Haul
·
Mix of LTL / Long Haul
·
Courier Services
·
Bulk Carriers
·
Intermodal
So – how do you make that happen… well… how do you build a
universe? It’s large and complex, but
reverse everything back – and it all starts with hydrogen…
What’s my hydrogen in
transportation? This is ironically a
question that has been grappled for some time since people started shipping
seeds for cloth. And it only became a
question when the scale of shipping grew from oxen carts, to shipping vessels.
The smallest unit is what I call the Parcel Unit. The parcel unit can be anything, as long as
you can define it by weight, height, length and depth. A parcel unit can be 5 tons of salt in a rail
car, or it can be a box of chocolates.
The purpose of any logisitics system is to manage the
movement of that parcel unit, and possibly bill for it’s movement.
Starting with movement, a parcel unit will generally not
have it’s own legs, so we have to assign it to a cargo unit. Again, normalizing a cargo unit, it’s the
inverse of a parcel unit. It still has to
have height, width, depth so we can calculate available volume, and determine
if that parcel unit will fit in that cargo unit.
Now that we know it can – we can assign that parcel unit to
a cargo unit. That becomes an Event,
which is the beginning of our tracking of that parcel unit. Certain events can trigger other events like
billing, or paying operators for hauling that parcel unit.
Which segues into – how do we move the parcel unit now that
it has been placed in the cargo unit.
That cargo unit needs to be given power to move from Point A to Point B. That’s why it’s assigned to the Power Unit.
The Power Unit just identifies what will be moving the cargo
unit. There can be times where Power
Unit and Cargo Unit are literally joined at the hip, like a cargo van, but a
power unit can be a semi truck, a bogey (that piece between two joined
trailers), a train, in the case of ships or airplanes, a combined Power/Cargo
Unit – just like the cargo van – just bigger.
Of course, the final part of this parcel journey can’t even
start without an operator of that power unit to navigate it to point B. That’s where the Operator comes in. The operator is the person or entity
responsible for getting that parcel unit from point A to point B. The operator can be a driver, pilot, engineer
or captain of the power unit. The
operator can also be a separate company who is providing that navigation
service.
Simplified within my system – an Operator is the entity
getting paid to move this entity chain from point A to Point B and an event may
be generated upon completion of that journey to compensate that operator.
BTW – I’m being careful to say “may or may not” get billed
or paid because at this point, the system is still open to be configured to
track parcel units. Some implementations
may just use the system to track movement, where others may use it to generate
billing and payroll.
What enables this is EVENTS.
Events can be configured to say – “ok – this task is complete – go look
up the customer’s contract to determine billing”, and off that same task we can
also spawn, “Go look up operator’s profile and determine payment”
If you’ve noticed through the above description of the
transportation life cycle, I’ve never said, “This is an LTL setup”, or “This is
a Long Haul”, or Intermodal, or marine shipping…
Literally – the framework doesn’t care.
What does matter is the configuration of the “Event”
system. Events are configured with business
rules, which define how the system should operate within that business.
So you have a system that can support a pure Long Haul
company, or pure LTL, or as is becoming more the case – a mixed company, that
may also have Intermodal links.
This is all supported because we stripped the problem down
to it’s basic purpose:
MOVING
THAT PARCEL UNIT!!!
Other things I’ve done to strip down the problem, and keep the
whole thing simple is to take away the question of building an accounting
system. I will not build an accounting
system into the framework, because that’s not the framework’s purpose. But I’ve seen this done on a number of commercial
systems, and it just makes me cringe.
What if I already have an accounting system, or I have a cloud based
system I want to integrate with. What if
I separate payroll provider… What if the trucking part of my business is just
one small facet??
BLECCCHCHCH!!! Thank
you – I’m just shoving that to the side.
Instead, we will provide interfaces to pass accounting
information to and from the system.
Events will determine when to send billing and payroll to the accounting
system, and when the system needs to display accounting information – it will
use an interface to get that information.
We do the same thing for CRMs. We have a “basic” definition of a customer,
enough for someone to manage the customer expectations related to
transportation, but if a business has a CRM, we have the ability to grab that
information, take what we need from it, and populate it into the system.
For both – we provide links back
to the CRM or Accounting systems.
The funny part of what I wrote above was that was not what I
wanted to write, but I think I needed to do that again – for sanity purposes…
have I thought everything through… why did I design it this way… does it still
make sense.
Fortunately – it does.
And now hopefully it makes sense to you.
Further entries in this blog will be my attempt to show where I’m at
with design – and some of the “dirt level” design questions I’m having.
Stay Tuned!
Subscribe to:
Posts (Atom)