Computer programmers have been arguing about programming languages for decades. Is functional programming better than object oriented programming. Should we all be using logical programming instead? In the midst of the language wars, mainstream object oriented languages have been quietly adopting functional language features. Java in particular has been adding functional paradigms like mapping and filtering over streams to the language in java 8. Now why would Java add streams now, when the concepts have been around for decades? Well part of the reason is that these language filters had become so mainstream it was hard to ignore the demand for them.
Why not just use functional languages? They have numerous advantages over object oriented languages like Java, sum types, higher order polymorphism, etc. What is the hold up? Well, while functional languages have many language features that are better, their weaknesses are typically in the tooling and the programming conventions that have developed.
When you create a new language you do not know what is the most effective way to build things in that language. In Java it has taken 10+ years to develop post Java EE conventions that are effective. And Java has been one of the most used languages in the world for that entire time. Many languages have features that are simply ignored in professional use. In Haskell the default String type is horrible and no one uses it for professional projects. Others like Scala require you to avoid higher order types if you want compile times to be reasonable.
Tooling is the other side of the equation. Java’s tooling has evolved in support of the conventions. Java has tooling to block certain dependencies, to auto-format code and to determine the cyclomatic complexity of methods. Today most Java professionals use either Intellij or Eclipse as their editor. These editors have had millions of dollars invested in them to support professional software development in Java. All this tooling makes Java work well once you have it setup, but getting setup is difficult.
The final stage is when you merge conventions back into the language. Golang is the best example I have worked with. Go has merged auto-formatting into the compiler. The ‘go’ tool supports formatting the same way it supports compiling and testing. There are no arguments on the subject. Your code is either formatted to spec with the tool or incorrect. The best part is that there is no setup. It can take days to get a new Java environment working even if installing Java takes minutes.
The consulting firm or agency model in application development is based on programmer hours. We the agency have X developers we want to sell at Y margin. You the client either need development done urgently or are unable to competently run projects internally. The agency makes money by leasing development ability to the client on an hourly basis. Our developers work on the application, our project managers keep track of progress so that you the client have visibility and we bill you for each hour we spend working on the application. Our margin is a flat rate depending on seniority and skill set.
Well, how do we scale this agency to maximize profits? We can either increase our margin or increase our revenue by selling more development hours. The rates agencies can charge are based on demand and how much value the client expects to get per engineer. In general application development can bill around $100-200 an hour, specialized talent might bill out up to $300 an hour. Billing beyond $300/hour requires very specialized skill sets that are hard to find people for. Most agencies will be billing in the $100-300 an hour range and have a mix of experienced and inexperienced engineers on staff.
Once you have capped out your rates for the talent you can get, what does an agency do? Well, investors want their returns so you either need to expand or sell. If you are privately owned you might be able to grow to a sustainable level, but that is easier said then done.
Instead of focusing on rates an agency can change its billing model to fixed price per project. Bidding a fixed price for a project lets you increase your margin by competing on efficiency with other agency bidders. Typically, fixed bid contracts are common in government and large corporations. The risk is that if the agencies estimates are bad you can lose substantial amounts of money on the contract. If your estimates are good you can potentially have bank busting margins.
The final means of increasing profits in an agency setting is to increase billable hours. This typically means growing headcount and hiring a sales team to keep everyone busy.
What is the best way to scale billable hours? You get a team of cheap junior developers or offshore developers and have them supervised by senior developers. Maybe you give the babysitters a fancy title like ‘Software Engineering Manager’.
I saw this personal ultrasound device last week. It is a $2k device that attaches to your smartphone and allows you to ultrasound anything you want. Its targeted at the medical field, with that price tag, but the form factor is spot on. These kinds of speciality sensors make sense, everyone has a smartphone. And if you can integrate at the smartphone level it makes your product cheaper and easier to use. I would like to get one of these just to see what is inside peoples’ bodies. I saw a video of a CT, or similar, scan while a person was speaking, and the tongue is shaped very strangely.
In a sense the smartphone as a common platform makes cheaper medical equipment easier. I wouldn’t be surprised if Bill Gates starts outfitting African hospitals with equipment like this in a few years. After that search and rescue squads might carry smartphone based medical equipment. My hope is that in the long term everyone will be able to get medical imaging when they want it, not just after taking time off to go to the hospital and waiting for hours.
Note: This is not affiliated, but if I ever get actual traffic I will be adding affiliate links.
I recently launched www.seattledatingpics.com for my photography work. It is a simple static landing page that pitches my online dating focused photography in Seattle. It seemed like overkill to launch a new wordpress site just for a single page so I decided to use Hugo (https://gohugo.io) as a static site generator. Hugo is written in Go and offers a way to create static sites with markdown and themes. Unfortunately, Hugo’s documentation for single page static sites is difficult to find.
The solution is that you need to find a theme which supports a single page static site, and then you create a _index.md file which acts as your home page.
Here is my config.toml for a single page static hugo site.
baseURL = "http://www.seattledatingpics.com"
languageCode = "en-us"
title = "Seattle Dating Pics"
theme = "ananke"
DefaultContentLanguage = "en"
SectionPagesMenu = "main"
enableRobotsTXT = true
background_color_class = "bg-dark-blue"
_index.md for a single page static site
title: "Seattle Dating Pics"
Online Dating is difficult and the right pictures make all the difference. I can help you capture your better side and help you meet people online.
I started seattledatingpics because I had trouble getting good pictures for online dating apps. Online dating should be fun and having good pictures helps.
### Options ###
__Take a Turn__: You and I will take turns taking pictures of each other with my equipment. We will get shots of the same positions and poses. This is free as long as you take a turn with the camera!
__Hire me__: You hire me to do a photo shoot of you. We will move around Seattle filling in your profile. I have rooftop deck and gym access. We can hit great spots that you like or go to my favorite places in the city.
Send me an email at email@example.com__ with seattledatingpics in the subject line and we will setup a photo shoot!
Remember to turn the draft parameter to false before you build for production. I was banging my head against the wall trying to figure out why my website worked locally, but not on S3.
You don’t realize how much switching jobs sucks until you do it. I moved on from my first post-college jobs after almost 4 year, and its been more of a shock than I expected. Once you have been working at a company for a few years you start to know everything that is going on. You know how to be productive. You know who is important, what projects are important and have a good idea of where things are going. You know if your job is secure and how to do well. But once you switch jobs, all that goes out the window and you have to start building up your organizational knowledge again.
The best way to increase your compensation is to switch jobs every 2-3 years. But while that saying is correct it underplays the cost to you of switching jobs. Yes, you are getting paid more. But you gave up your political position in your last company. You lost years of domain expertise and a large number of valuable relationships. If you left on good terms, which everyone should, you will still have those people in your network. But they will not be in your corner for the next political battle.
Early in your career switching regularly is probably the best option. But as you move up in the hierarchy you may need to stay at companies for longer terms. At the beginning you can get promoted every years, Developer 1, Developer 2, etc. But you reach a point eventually where it takes longer to move up. Going from engineering manager to vice president is much harder to do than moving from senior engineer to engineering manager. You will need to know more people and have a better political position to reach vice president than engineering manger.