Michael Snoyman is VP of Engineering at FP Complete, providing server software and devops solutions for cloud computing. We recently chatted with Michael about a wide range of topics including Haskell, open-source applications, and server reliability – and also heard some tips for job seekers in the tech industry.
Tell us a bit about your career path. How did you become an expert in web development and web servers?
Like many others, I started programming at an early age, playing with such things as Logo and QBasic and eventually teaching myself C, Java, and a handful of other languages before entering college. My initial career path was not in computing, but working as an actuary in auto and homeowners insurance. As it happened, my programming skills became central to almost all of my actuarial work, which consisted of data processing, user interface creation, and large-scale analysis. After doing this for a few years, I decided my favorite part of the job was the programming itself, and I decided to switch into full-time server side software development.
What is the difference between software development and software engineering? Or can these two terms be used interchangeably?
I think many people (myself included) often use the terms interchangeably. But speaking more carefully, I consider engineering to be a more comprehensive function than development. Development consists of writing code to tell a computer to do something. Engineering is about understanding requirements, designing a solution, considering interactions of complex systems, planning for quality assurance (QA), documenting all of it, and of course writing the actual code. That said, to my knowledge there are no formal definitions of either term to back this up, and you’ll find people with vastly different interpretations.
What are some of the main advantages of using Haskell over other web development approaches?
Contrary to what software developers would like, the majority of our time is not spent in writing software, but in maintaining it. Adding features, fixing bugs, and just trying to understand the last person’s code are the biggest time sinks when developing. (Not to mention that, often times, you yourself are that “last person” who wrote some terrible, unmaintainable code.) Haskell is a language that places an emphasis on getting things right the first time, leading to more maintainable code with overall fewer bugs. On top of that, Haskell is a highly performant language—meaning you get fast production code without spending a fortune on machines — and features quick prototyping, which lets you get your product to market quickly.
These days, what are some of the biggest challenges faced by people and companies who are tasked with improving the reliability of servers?
In working with our customers, I see three major challenges recurring:
- Lack of reliability in the software itself. This often comes from using tools, languages, and libraries that make it difficult to write things correctly in the first place.
- Complexity of modern software solutions. With the rise of techniques like microservices architectures, software now has more components than ever before. We have to remember that each added component is another moving part which can fail.
- Deploying to the cloud. This often makes sense for teams of various sizes, but it’s not without perils. Services like AWS and Azure are powerful beasts, and without experience using them correctly, it’s easy to end up creating unreliable solutions.
When starting a new project myself or advising others on their existing projects, I always place a large emphasis on the right architecture. This means understand your requirements; design a minimal system capable of fulfilling those requirements; choose the best tools, languages, and libraries for the job; and write the code with a strong consideration for the needs of distributed cloud computing and thorough automated testing.
In today's programming world, what types of projects or programs are open source web applications best-suited for?
For better or worse, desktop applications are slowly but surely being replaced by web apps. There’s a lot of logic to this: it’s easy to write web apps with just about any language you like, and you get cross-platform support automatically. In addition, with tools like Electron making it possible to wrap up a web app on a local machine, it’s getting even easier to stick to just the web development stack. The downsides are less local machine integration and often significantly higher resource usage. But people rarely care about that these days.
The question of open source vs closed source is much more nuanced. Many companies have discovered just how successful you can be with making your products open source. A huge amount of our tools and libraries are given back to the community as open source, and we see great support from the community in improving these offerings.
When you were being considered for Director of Engineering at FP Complete, what were some of the aspects of your position that you were able to negotiate successfully?
When I was initially discussing my the position in which I'm now working, I was very passionate about wanting to continue the work I’d been doing personally in helping the Haskell programming community flourish. I was fortunate to find that our CEO had similar feelings to mine. He also thought that Haskell could help make the programming world a better place. In addition to getting to continue pursuing that goal, my position promised me the chance to learn from a truly experienced engineering manager in how to manage both teams and projects to success – a skill which I am still learning from him, and one I hope I’ve made some progress on in the past four years.
What advice would you give to today's software developers to help them in their search for their next "perfect" job?
The biggest advice I give people getting started is to do open source work. I’m pretty extreme on this one; I usually consider someone’s open source portfolio far more telling than their formal education. Interacting with a team of globally-distributed developers to produce something tests not just raw coding ability, but many other aspects of being on a successful team.
Beyond that, I’d recommend getting experience with a related skill, like QA, devops, or documentation. Being the dev who understands how to actually deploy the software is more valuable than you might imagine.
Since the corporate world often vacillates between outsourcing their IT services and web development and bringing those functions in-house, what do you foresee for the future regarding that trend?
With the move to globally-distributed teams, I think the line is going to begin to blur a bit. I expect it to become far more common to have contractors working remotely on a 100% basis for a company. Once you get to that point, the difference between hiring an individual contractor directly versus through a consultancy begins to blur even more, making the question more financial than qualitative. I expect it to become more common to consider remote workers—whether full-time employees, 100% contractors, or third-party consultants—integral members of engineering teams. But perhaps the fact that I’ve been working in that capacity for about eight years now has clouded my perception.
How much are software developers and software engineers being paid in your area? Check out paysa.com to find out.