Healthcare startup in Bangladesh

I’ve just started working as an advisor to a healthcare startup in Bangladesh called EMFIXR.

Emfixr has the goal of connecting doctors and patients in rural & under-serviced areas in developing countries.  They’re starting in Bangladesh where some of the founders are from.

Dan Mustafa, a founder of Emfixr reached out to me through Angel List originally looking for a developer.  I don’t have the time, but I agreed to do what I can to help.  I also plan on coming on as an investor once they’re ready.

Besides technical advisory work, I’m helping Emfixr build publicity and marketing by creating a Kickstarter campaign.

I connected Dan with MovingWorlds to find someone to help creating a documentary about their project connecting doctors with patients in Bangladesh.

Here is a video by Roger Huang describing Emfixr.

And here is the Emfixr promotion video presentation.

If you’re interested in working with Emfixr in any way (development, social media marketing, investment, etc) please contact me.

What do you need to start a product business

I was reading @patio11’s description of how he started a “microISV” (remember that term from a few years back) from a simple Bingo Card Creator in 8 days.  It got me thinking about what you really need to start a product business online these days.  Besides the flippant answer “not much”, here’s the list I came up with:

What do you need to start a product business?

  • a product
  • a place to advertise that product
  • a description of the product and reasons to buy it
  • a way to market that product
  • a way to take money
  • a way to deliver the product to customers
  • a way to handle customer support

Technically, you don’t need to be able to handle customer support until you have customers.  But once you do, you’d better be ready.  Don’t get too worried about it at first.  Email is probably good enough until you have more emails than you can respond to.

You have to have a product, but you don’t necessarily have to have built the product yet.  But you do need to be able to fulfill orders once you have customers  If you don’t that’s called fraud.

A web site fits the need of advertising the product.  You have to tell people what your product is and why they should buy it. Coming up with decent marketing copy is actually one of the most difficult and dreaded aspects of self-promotion.  At least for me.  This can be as simple as a blog or hosted shopping cart.

But no one is going to read that if they never see it, so you have to have a way to drive traffic.  This can run the spectrum from AdWords to outbound sales calls.  It also includes SEO and networking.  You won’t know what works for you without some experimenting and market research.

So you have a product, a way for people to learn about it, and a way to get them to find out about it, and now they want to buy it.  You need a way for them to pay you (this is the core of the business.)  But once you have a website with a landing page that tells people about your product, and people who are in the market for your product are actually seeing that it exists, and are convinced it will solve their problem, you need to be able to close the deal, take their money, and deliver the product to them — you have the core of a business that can scale from a single downloadable e-Book to Amazon.com.

Ok, you may have some scalability issues, but nothing you can’t overcome, right?

As long as you’re making enough profit to make it worth your while.  Don’t forget to balance the books — or get someone else to fund you.

Some other things it might be nice to think about, but not technically necessary up front:

  • a way to communicate with prospects & customers – an online newletter?
  • a cool product name and fancy logo
  • SEO and organic marketing
  • analytics to tell you what works and what doesn’t work
  • recurring billing
  • business organization (LLC, Corp, etc)

You first need to:

1. Find something people want and build it

2. Inform people that you have a product that fulfills their desire

3. Convince them to buy your product

4. Be able to take their money & deliver the product

5. Handle customer issues

 

 

Testing is a cost center

A cost center is a part of the organization that doesn’t produce profits.  In other words, a necessary evil.

For a long time, all of IT was considered a cost center.  You paid for IT infrastructure and staff, but didn’t consider it an investment in your business.  But businesses in the late 1980s and 1990s started realizing that investments in IT equaled improvements in productivity.  IT investments really started paying off.  And then, with the growth of the internet in the 2000s IT because essential to business.  A professional web site became a marketing necessity. E-commerce became a critical sales channel.  And support & customer relations became valuable IT investments.

But testing is still considered a cost center, even within IT. It’s just something you have to do to release products. Some businesses would skip it if they could, but they feel a need to do due diligence to avoid embarrassing bugs, costly outages, and dangerous security breaches. Some developers have embraced testing, but many more still grumble about *having to* write tests for their code or wait for QA to finish testing before they can release.  Even Agile shops.

People quote the Agile Manifesto about people over processes or working code over documentation to justify the belief that testing is not merely a cost center, but an unnecessary evil.

Testers have always known that when it comes down to crunch time, testing is the area that gets cut first.  Some justify that it is because testing is the last step, and the last gets cut first.  But it’s not the last step.  Deployment is.  And nobody wants to cut deployment out of the process.

How can we help organizations realize that testing is not a cost center?  That it makes development faster.  That quality has value, even if it isn’t qualifiable.  That solid testing processes are beneficial, and that good testers are worth a premium.  That testing needs to be planned for up front just like design, development, operations, and support.  That testing isn’t a cost center within IT, that it actually adds value.  Or does it?

My son’s first programming lesson

This morning I was working from home at the dining room table while my 5 year old son ate his breakfast of Frosted Mini Wheats beside me. Baby was running around destroying things and sister was still asleep.

At one point, I got a pen and paper and started diagramming inputs and control flow (for a deployment script triggered by Jenkins). My son asked what I was drawing, so I explained variables, as best I could, with names like TARGET_APP_SERVERS, BUILD_NUMBER_PRODUCING_ARTIFACT, and JOB_GOAL.

I figured it would go over his head and I could get back to work. But he asked a follow up question. “What is your GOAL”?

“To upgrade the program on the servers or to just restart the server,” I explained.

But he wasn’t satisfied. “What do you want to do — upgrade or restart?”

“Upgrade”, I said.

I started to get back to work, but he wanted to sit on my lap. I decided it was time.

I opened a text editor and wrote out a little program.

name = input("What is your name? ")
print("Hello " + name)

It was very similar to my first program, at age 7, though mine was in BASIC on a TRS-80.

I read the code to him and explained that NAME would be replaced with what he input (or typed).

That says “Hello” he said, pointing to the screen before I got to the second line. His mom is a good teacher.

We fired up the program in the console and I watched him hunt and peck to spell out his name on the keyboard with all the mixed up letters. Then I showed him how to press enter.

“Hello harmon” the computer wrote back.

I ran the program again, this time he requested I enter my name.

“Hello Aaron” it printed.

He was delighted. I added some other lines and watched him practice spelling and reading the output to him

What is your name? harmon
Hello harmon
What is your favorite color? red
I like red too
What is your favorite toy? lego
lego is fun to play with!
What is your favorite show? jang bricks
I don't like watching jang bricks, I prefer My little pony

The last answer was not satisfactory to him, but I’m sure his sister (still sleeping) would appreciate it.

“How is it so smart?” he asked, adding “Computers are like people!”

Using COM automation to test SolidWorks

I’m building a test harness for testing CAD software plugins.  Right now, I’m working on figuring out how to use COM automation with SolidWorks and the SolidWorks API.

One of the first steps is to be able to launch Solidworks and open a document. It took a bit of searching (and trial and error), but I finally found the necessary references and steps:

  1. Create a new C# project in Visual Studio
  2. Add the SolidWorks references
    • c:\Program Files\SolidWorks Corp\SolidWorks\api\redist\SolidWorks.Interop.sldworks.dll
    • c:\Program Files\SolidWorks Corp\SolidWorks\api\redist\SolidWorks.Interop.swconst.dll
  3. Instantiate a SldWorks object
  4. set visible
  5. Open your design document
  6. Test it
  7. Close your design document
  8. Exit SolidWorks

The simplest code looks something like this:

using System;
using SolidWorks.Interop.sldworks;
using SolidWorks.Interop.swconst;

namespace SolidWorksExample
{
    class Program
    {
        SldWorks swApp;

        static void Main(string[] args)
        {
            var filename = @"C:\temp\pressure plate.SLDPRT";
            
            var program = new Program();
            program.StartSolidWorks();
            program.openPart(filename);
            program.verify();
            program.closeAllDocuments();
            program.StopSolidWorks();
        }

        public void StartSolidWorks()
        {
            swApp = new SldWorks();
            swApp.Visible = true;
        }

        public void openPart(String filename)
        {
            var swDocType = (int)swDocumentTypes_e.swDocPART;
            var swDocOptions = (int)swOpenDocOptions_e.swOpenDocOptions_Silent;
            var swDocConfig = "";
            int fileerror = 0;
            int filewarning = 0;
            swApp.OpenDoc6(filename, swDocType, swDocOptions, swDocConfig, ref fileerror, ref filewarning);
        }

        public void verify()
        {
            Console.WriteLine("This is where you test it");
        }

        public void closeAllDocuments()
        {
            bool IncludeUnsaved = true;
            swApp.CloseAllDocuments(IncludeUnsaved);
        }

        public void StopSolidWorks()
        {
            swApp.ExitApp();
        }
    }
}


Windows Virtual Test Lab in the Cloud

I’ve been working lately on setting up a virtual test lab for a startup.

As part of their strategy, they are building a plugin for CAD programs such as AutoDesk Inventor and SolidWorks. The need to test their software across a variety of platforms, including Windows XP, Vista, 7 & 8 — both 32 and 64 bit versions of each OS — and they’ve already found bugs specific to the various platforms, so they’re not just being paranoid.

Currently, they have their developers manually test each OS by loading a VirtualBox VM with the requisite OS version and CAD software.  They install a new build of their plugin and then execute their tests.  Needless to say, this is very tedious and slow.

So I am working on a solution that would allow them to have cloud-accessible virtual machines that they can automatically install their software to and execute automated tests on a matrix of OSes. They need to be cloud available and not cost-prohibitive.

The simplest solution would be to simply install the needed OSes on bunch of off the shelf PCs, but that can get expensive, and doesn’t really facilitate secure remote access. On-demand cloud computing environments such as AWS and Azure would be ideal, but they don’t offer client OS versions, and good luck finding anyone who will support end-of-lifed XP and Vista.  I explored setting up a hypervisor, such as VMWare ESXi, Xen, or Microsoft Hyper-V on a cloud environment, but that would be pretty expensive.  So I then turned to setting up a dedicated server or co-locating a custom build server with the same.

VMWare has the best management interface, but vSphere is prohibitively expensive for this size of deployment.  For a Microsoft-only solution (which this is) Hyper-V is a possibility, and at scale is cheaper than VMWare, but Windows Server Datacenter licenses can be expensive too.  XenServer is the cheapest, but doesn’t have much in the way of management or admin friendly tools unless you also buy a commercial license from Citrix.

I’ve settled on either working with a professional to set up XenServer or installing a free ESXi hosted on a dedicated server, and then paying for vSphere licenses as I expand.  I’ll also be building a fairly beefy machine with 8 cores and 32GB of RAM that I can co-locate here in Orem, UT at Voonami or Fiber.net.  Then I’ll install the hypervisor with 8 client VMs and install the CAD software, Visual Studio, and set up automated tests and continuous integration.

I plan on building extra machines and scaling up, so I will be offering Windows (and Linux) VMs in the cloud for testing purposes.

I have another user interested in a remote workstation that they can build and execute tests on and take advantage of the co-lo facilities high bandwidth, redundant power, and my scalable on-demand processing power from their own (or any other) PC.  A powerful, remote desktop is almost the idea solution for a traveling on-the-go  consultant as well.

Dynamic comparison instead of dynamic typing

There had been a long-running debate among developers about the relative merits of of static or dynamic, weak or strong typing.

Static typists will argue about compiler optimization, type safety, etc.  Dynamic typists will talk about flexibility and cleaner code.

There have been several attempts to find a common ground using type coercion, “duck” typing, implicit type casting, optional typing, etc.

Strong typists argue for catching errors early, preventing subtle defects, etc.  Weak typists just want to get work done and think that most of the time your just dealing with numbers or strings.

I’m in the weak/static camp, sortof.  I see the advantages of strong typing (in theory), and the practical advantages of dynamic typing (in practice).

But the biggest advantages I see of static typing is discovery (in your IDE) and of weak typing is readability.  In other words, they make my job as a developer easier.  Forget type safety, correctness, and even simplicity and flexibility.

However, weak typing is best demonized by two examples… void * in C and everything in PHP & Javascript.

Static typing is easily attacked by the amount of successful code written in languages like Perl, PHP, Python, and Ruby.

It doesn’t have to be this way though.  We can all get along.  I agree that type coercion and duck typing can lead to some very subtle bugs.  And I agree that the verbosity required of static typing can be a pain and a real flow killer.

What I’m proposing is to forbid type coercion, and replace it with sane type comparison.

The simplest type comparison is 1==true or 0==false.

Things can get trickier (and more ambiguous) with null==false or “true”==true.

And what about empty strings, converting numbers to strings, or strings to numbers.

In languages like Perl, an array returns it’s size.  Should an array of size zero return null?

Also:

  • What about numeric values such as Javascript’s NaN (not a number)?
  • What about comparing integers and floating point numbers?
  • What about objects?
  • What about object hierarchies?
  • What about equivalence vs identicalness (identicality vs identity)?
  • What about comparing references?

Obviously it’s a tricky rabbit hole, and some decisions need to be made.  And I’m prepared to make them.

First of all, we don’t have to live with type coercion — except when we make comparisons or want to explicitly cast from one type to another.

parentheses have a type comparison operator

if (foo == null) should be reduce to if (foo)

This means that you’ll need temporary objects, but hey, we have lots of memory, right.  For most types, though, you can have one instance of a conversion tree.  Objects can override the comparison and conversion functions if they want to.

By having the type comparison in the parentheses, you can also invoke it with a cast

foo = (int) foo

Objects can have a comparison operator — the default object comparison operator returns its type.  Types return a string of the type name.

== is for comparison, === is for identity (yes, PHP got this right)

I’m not sure what to do about string comparison.  I’m loath to admit that Java got it right that all strings are immutable and use a single hash table and GUIDs.

But what if all numbers were just an immutable table.  You could have one for integer values and one for decimals?

Anyway, the point I’m getting at is the general principal that you should always be able to compare types implicitly, and cast them explicitly.  By allowing these two things, you gain most of the simplicity & readability benefits of dynamic typing, and still retain most of the safety and discovery of static typing.  And you avoid then otherwise necessity of weak typing in many cases.

Someone buy this guy a TLDR;