Ask HN: What are the different means of distributing software?

6 points by rifung ↗ HN
I just realized that I've gone through school and worked for a few years without really appreciating the differences between the different means of distributing software.

For example, if you write a Java app, presumably you give people a jar to run, and this requires your users to have Java installed (I think?). On the other hand, if you write an app in C, I assume that they don't need anything installed? Or perhaps they need libc which can be assumed to be on every modern OS?

These are the kinds of questions I have. If anyone could give me some material to read or explanations I would really appreciate it.

Thanks!

3 comments

[ 3.0 ms ] story [ 27.7 ms ] thread
Honestly this is a huge topic that I think has as many facts as opinions. And to be fair, you are not alone, rarely have I hired a new/recent grad that knew how to do deployments well, unless they had internships that taught them or built some software to deploy themselves. Experience is what helps. For resources to use, I think your best bet is narrowing the topic some to a specific language (or 2) you are working in (and ideally target OS or OSes), then it is a lot easier to help you with resources. e.g. targeting Windows and nix is tougher then targeting nix alone, or Windows alone, regardless of language.

As for my opinion: I do not believe there is one language that has the lock on easy/hard deployments, some definitely make it more challenging but overall they all have their good and bad parts. In my experience, C/C++ can be both the easiest and hardest to deploy. For example, I did a small sample console level C++ program running on OS X for someone a while back, literally copy and run, super simple. On the other end we have developed a sophisticated piece of imaging software for a client in C++ that uses the GPU etc. It has required about a week of time to get the build to work on linux and OSX machines, and we are still tuning it. This is simply because there are so many pre-reqs that have to be configured properly and generally built for the specific machine and OS to get the most out of the software and hardware.

At the same time, Java's promise of write once run anywhere is reasonable for many things, but you'll find generally is a bigger challenge then initially anticipated. .NET is honestly probably the easiest in my experience to deploy for Windows environments, and I am fond of Node.js apps on nix as they are pretty damned easy too (npm really is a huge reason why).

As for things to watch, you already have the right idea, its library, library version, library location in some cases, DLL Hell on Windows still isn't totally gone, binary compatibility on nix, etc. And just because you write something in C doesn't mean you won't have deployment issues, as the versioning of libraries and features you use can become very specific. At the same time, C/C++ is one of the most deployable languages across devices, but that comes at some complexity.

(comment deleted)
web-based: javscript usually, unity and flash also are a possibility. At one time Java was the choice for this, but not so much anymore.

desktop: usually a compiled binary. I've also seen flash and unity compiled to native binaries. Bytecode languages like Java and .NET are also a possibility.

app store: iPhone and Android