1,254 karma · joined February 17, 2008
Contact me at sales@cogini.com or https://www.linkedin.com/in/jakemorrison/
This book is quite good on the standard parts of managing professional firms e.g. accounting and law: https://www.amazon.com/Managing-Professional-Service-David-M...
Technical consulting has significant differences, however. There is a big separation between the sales and requirements side of the business and the solution/execution side.
One of the things that most resonated with me from the book is three kinds of consulting companies: expertise, experience and execution.
Expertise consultancies solve complex problems that require non-standard solutions, e.g. a big merger/acquisition or designing a complex software solution. The boss typically has decades of experience, and the "juniors" have a decade.
Experience consultancies solve semi-custom problems, things that are amenable to process and knowing the answer to common issues in a domain. An example might be setting up a new legal entity for a startup, or building a custom website to handle e-commerce.
Execution companies handle well understood problems at lower cost than it would take to do in house, e.g. monthly book keeping, building WordPress websites for small businesses.
In the book, he talks about a number of standard ways of splitting up profits in a partnership. A lot depends on the goals of the firm based on its stage. So the partners might value individual billable hours, managing staff that are billable, bringing in business, or being the "managing partner" who makes sure that the rent gets paid and the copy machine works.
It's possible that you have a mix of Expertise, Experience and Execution in one firm, but one basic rule is that in order to be a partner, you should not be relying on another partner to make your team work, e.g. bring in sales.
This is one reason that technical consulting firms are different, because being great at technical execution does not mean that you are good at sales and relationship management. In fact, it's negatively correlated, and essentially impossible to hire for. Anyone who can do the job well can run their own consulting company.
It's like they are using cloud pricing as a reference for dedicated servers. We run dozens of dedicated servers, and using the cloud would be 10x the cost. Amazon at least has a culture of passing on cost savings to customers.
There was a problem with a server, and I needed to connect to the console. That involved using a VPN, then downloading a Java applet with a very specific (obsolete) version of Java. The applet didn't support copy and paste, and frequently repeated keys. Try typing in a 16 digit randomly generated root password by hand with your keyboard duplicating keypresses. Linode can offer a console over SSH, why not IBM?
Screw IBM.
I wrote about it here: https://www.cogini.com/blog/paypal-know-your-customer-failur...
-P max-procs
Run up to max-procs processes at a time; the default is 1.
If max-procs is 0, xargs will run as many processes as
possible at a time. Use the -n option with -P; otherwise
chances are that only one exec will be done.
-n max-args
Use at most max-args arguments per command line.
Fewer than max-args arguments will be used if the size
(see the -s option) is exceeded, unless the -x option is
given, in which case xargs will exit.
So here is a "map/reduce" job which takes the log files in a directory
and processes them in parallel on eight CPUs, then combines the results. find . -name "*.log" | sort | xargs -n 1 -P 8 agg_stats.py | sort | merge_periods.pyYou can put an Erlang/Elixir app into a container and deploy it, but containerization doesn't provide as much value as it may for other languages. The Erlang VM doesn't depend much on the operating system. The mix build tool tightly manages runtime library dependencies, and building a release combines the VM and the app's libraries into a single tarball that you can deploy as a unit. So we don't find it particularly useful to use Docker/Kubernetes to deploy.
Erlang/Elixir makes it very easy to take advantage of all the CPU cores available, so you generally benefit from having one instance with lots of CPUs instead of lot of little instances. And it can be a lot cheaper to do this in a dedicated server environment instead of the cloud.
So on the whole, Kubernetes is not that big a win for Erlang, but they work fine together.
With those syntax improvements, we get the power of Erlang with the ease of use of Rails: http://www.littlelines.com/blog/2014/07/08/elixir-vs-ruby-sh... (A bit dated, but this is the post that sold me on the platform.)
I have written a detailed guide here: https://www.cogini.com/blog/best-practices-for-deploying-eli...
Make a source code release and encrypt it. Put it somewhere accessible to the customer, e.g. an S3 bucket owned by them. Arrange for the key to be given to the customer under the terms of the escrow agreement, e.g. send a letter to your lawyer with the terms of release and the key.
I can see value in having someone handle this for me, with a nice UI. It's fundamentally a clerical job, though, with some legal process / responsibility. So $50/month is already a fair amount, to say nothing of $1000.
This means that there is a conflict between performance and having a well structured object oriented framework.
Demand loaded classes and byte code help a lot with that: http://www.yiiframework.com/performance/
Best would be a model where a persistent process handles multiple requests concurrently, but that is not normal for PHP. So you need to make sure that all the libraries you are using are not leaking, have a nice db connection pool, and write a PHP framework that handles concurrency. Might as well use a better language at that point :-)
But the t2.nano instances will make a DIY solution cheaper.
In our new "cloud native" systems we are ending up with a number of single-purpose VMs in AWS or GCP. So being able to run a minimal OS image with OpenBSD has it's attraction. At this point, it's easier to use CentOS or Ubuntu due to application compatibility.
I suppose the next logical step is Docker or NixOS.
As a business owner, my best strategy from a personal tax perspective is that my company makes no profit - it should all go to me as salary. In the past, that has put me in conflict with a non-US partner, as it didn't match his best strategy. And it means that "profit sharing" for employees doesn't make sense.
So US tax law costs me considerable money in compliance costs and fundamentally distorts the way I run my business, for no additional tax revenues to the US.
Fundamentally, residence based taxation makes more sense. It's more direct and easier to manage. People talk about these benefits of being a US citizen, as if I don't get services from the country where I live.
Another big thing is that the Elixir community focuses on ease of use and out of box experience the way the Rails community did. So it's easy to get started and all the pieces generally fit together well, e.g. the mix build tool works great, as does the hex package manager, and relx release builder. With Erlang it's more DIY. We have recently converted a big Erlang project to use mix as the build tool, and it just eliminated a bunch of cruft. The interop between Elixir and Erlang is easy. So you get the best of both worlds, the ease of use of Elixir with the power of Erlang, with the highly mature runtime and libraries. And with Phoenix we get a web framework with world class ease of use.
And this works across the whole architecture. One of our projects right now is a mobile medical application for medical where caregivers communicate in real time with a number of patients. We have the mobile app talking to the server using a REST API and real time messaging for chat. The caregivers can communicate with the server using a web application with integrated web chat or via an XMPP client. And we have the normal public web and admin CRUD. All via a single server process in a single language. This is what Elixir/Phoenix was made for, it enables a new generation of modern apps.
We use "mix release" to build the tarball, scp to the server and unpack, then run using an upstart unit which runs "exec su -s /bin/sh -c 'exec "$0" "$@"' myuser -- /path/to/deploy/directory/bin/myapp foreground"
It's pretty painless. We are automating with Fabric now, but will likely be switching to Ansible soon.
In my experience, non technical companies can be a bit irrational about releasing software. They don't understand it, so it's hard for them to value it. They will have a knee-jerk reaction and just say no. Or think that it's more valuable than it is and want to keep it for themselves, and be unable to do anything with it.
Rails is the classic example of optimizing for developer ease of use instead of performance. Which probably makes sense for startups, but scaling is a pain in the ass.
Openresty is great for infrastructure level solutions, e.g. request routing and authentication. It is used by some of the largest Internet companies in China.
The benchmarks at http://www.techempower.com/benchmarks/ are a reminder of how poorly some popular frameworks perform. And how poorly cloud performs vs relatively cheap dedicated hardware.
# Multiplex connections if there is more than one Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
Foreign companies never even started in the US, so there is no question of them "leaving" or "paying their fair share". If US companies are going to be competitive, they have to get out. Otherwise, investors will just choose non-US companies. It's better to set up overseas to begin with, and save the trouble.
Same thing with the US taxing citizens living abroad (unlike other countries). And so the IRS sticks its nose into every single financial transaction in the world in order to get money it doesn't deserve.
The US government should just stop being so greedy and entitled.
Yii uses demand loading of classes to avoid the performance problems of object oriented frameworks which load all the files off the disk for every request (see http://talks.php.net/show/froscon08). And it uses prepared statements for SQL, improving performance and avoiding SQL injection attacks.
It's nice for simple applications, but lately has been growing to include other features.