How 'DevOps' Is Killing the Developer (2014)
jeffknupp.com
jeffknupp.com
Years ago a DBA I summoned to a project told me that my DB design was not bad, given that I'm a developer. Then he made it twice as fast by redesigning tables, putting in triggers, etc. (it wasn't a matter of ORM.)
Sadly DBAs are not even on the radar of small to medium projects. If they are ever hired it's too late to take full advantage of their work. The naive DB design of developers is too naive. Somebody could say that a DBA would be a premature optimization, IMHO the reality is that the tooling we are using (especially ORMs and their migrations) are designed to create vanilla DBs and vanilla queries (which are fine in all low volume applications.)
An example from a distant past: I remember when foreign keys were taboo among Rails developers because Rails didn't have a way to express them in its DSL. I added them with manual SQL queries in migrations. I was told they were useless but I kept them in the DB (lately I discovered that many developers don't know SQL and didn't attend to any DB course at university.) Fast forward to a few days ago: a developer of a Django project asked me if we had indices in the database, because he's been told that they could speed up queries. I explained him that Django adds indices in the obvious cases (primary keys and foreign keys), plus I added some on the fields we often use in our queries.
I think the reason DBAs are not hired is because we don't need them as often and for as long as we do devs.
And all the rest of the time, you've got a very smart person whose job is basically just to make sure the backups are running smoothly.
I'm not sure what the solution there is. Only the largest enterprises can really keep a good DBA busy with work that isn't just skull-splittingly boring. Maybe merge the DBA role with BI or data engineering?
Good DBA's are also really hard to find. We have been looking for one for the past 6 months with no luck
My school's DB course taught you to build databases. You're expected to learn SQL on your own. And we all did. Not knowing SQL is an ongoing lifestyle choice.
As someone who has had DBA in my job title before, it saddens me to think DBA was needed to explain the importance of foreign keys or indexes (this should be general developer knowledge at this point). As a general rule, any field used in a join or where clause is an index candidate. And foreign keys (along with other constraints) are like type checking in code. They help you not do anything stupid later.
The issue is “framework developers”. I am not opposed to learning and using frameworks but you should always know at least one level below the framework you are using.
If you are a web developer who uses Angular/React and Bootstrap everyday you should know JavaScript, CSS, and HTML well.
If you use an ORM, you should know enough about how databases work to have a mental model of what the database is doing.
No one has thought to run a query plan
(N + 1)*10000000000000000
Why wouldn’t a developer’s job be to learn how to optimize a database query but would be to learn how to optimize a program?
I've never heard that good advice put so succinctly before. Has this advice been around for ages and I just missed it, or is it a newly relevant concern?
BTW, what would two levels be to, say, a React developer, out of curiosity? Would it be the browser engines? Knowing how JIT compilers work, etc.? Or would it instead be a deeper understanding of the language spec, so that you know more internal functioning? Not that there has to be a clear-cut answer.
When I started learning AppleSoft Basic back in the 80s, I knew how to optimize my BASIC programs because I knew how the interpreter worked and so knew assembly.
When I started learning C#, I knew both C, Win APIs and how the CLR worked.
But for a web developer who communicates with backend servers, I think it’s important to understand HTTP.
Language-wise, I'd say babel "javascript" is the highest level of abstraction. One level below is understanding what things like JSX and class properties transpile to. One level below is understanding JIT strategies (e.g. when hidden classes deopt), memory usage of various patterns, etc. One level below is understanding specific semantics of high level APIs (e.g. exact accuracy of a high res timer implementation), or regexp memory footprint by looking at browser source code.
Yet I've never once been asked about this in an interview despite using it maybe once a week for years.
O(n) on the other hand...
I run into this problem whenever I'm interviewing for devs on my team. As a java shop, we usually get people who come in and claim to be proficient in Spring, but when I start asking them questions about the underlying technologies they blank.
My favorite weed-out question when I'm worried someone is too tied to a framework (especially when its one that isn't actively in use on a project) is to ask them to give me some examples of the limitations of it. To me, being able to recognize the things your favorite framework is not able to solve effectively is the best indicator that you aren't using it as a crutch.
Now on the other end AWS CloudFormation for infrastructure as code, I could go on for days about its limitations.
1) It's a web framework. So, not suitable for command line tools, desktop GUIs or persistent message queue workers. But you can do all of that in other kinds of C# .NET app.
2) However, .NET is a Garbage Collected language and should not your first choice for e.g. a real-time device driver or OS kernel.
But people do try to do some of those things that I listed, using ASP.NET.
My DB course taught us relational algebra and calculus and you were expected to learn SQL independently.
I am constantly bemused tho’ at the extraordinary lengths some devs will go to to avoid SQL. I’ve known people who will grudgingly do SELECT * FROM table; then extract the one row/column they want on the client. Then they complain that the DB is slow when it’s loadavg is 0.01...
Though, once you get into more advanced things like stored procedures and triggers, SQL becomes a little hostile.
My second point is that something about relational databases and SQL just doesn't sit well with (many) software developers. As a result, we have a lot of XML and JSON blobs stored in key/value databases, a lot of software that doesn't work very well, and we are still dealing with a lot of problems that Ted Codd solved 48 years ago.
In the end many of the various contracting companies started to work together to work around the DBAs ineptitude and work on ways to speed up performance, including projections. We kept him in the loop, but it just felt like the only thing the DBA cared about was permissions and user accounts. In fact that's the only thing we kept calling him for was one of our accounts would suddenly not work. He was also extremely insistent against tools like Liquibase to keep all environments in sync and standardized. Instead our Dev and QA through prod would all have different tables and columns all over the place because the DBA WAS IN CHARGE OF THAT.
This was a large organization, and 99% inefficient. There IS a reason large companies are trying to run projects like startups. DBAs are often like pizza flippers, whereas developers don't like doing things multiple times.
What? Relationships (and thus foreign keys) have been around since before 1.2.
I started using Rails almost at the very beginning. See https://stackoverflow.com/questions/2373262/are-foreign-keys... from 2010 for a bunch of links to DHH opinion on the matter (from 2006.)
Foreign keys made it into the DSL with Rails 4.2
http://guides.rubyonrails.org/4_2_release_notes.html#foreign...
https://apidock.com/rails/ActiveRecord/ConnectionAdapters/Sc...
Before that we were using gems or writing SQL into the up and down migrations.
https://robots.thoughtbot.com/referential-integrity-with-for... (from December 2014)
But it's not DBAs as in database admins that are needed. Every project should start with the correct data architecture and for that you need an architect. There are endless number of projects that eventually failed because the data architecture did not scale. That's due to a programmer who designs the database according to the way that their preferred tool works best, which is usually bad for data.
For any project that requires a database, always start with the method that data will be reported. If a report takes a long time to be generated because of your design, then you need to fix that first.
The term "Full Stack Developer" is especially problematic because taken at it's literal meaning it suggests that a developer should be fully competent at ALL aspects of developing an application, which necessarily include deep understanding of system administration, database administration, tertiary dependency (caching apps like Redis, for example) administration, network infrastructure configuration and maintenance -- all of which are impossible for one person and we haven't even gotten to code yet! I think a different term needs to be coined which implies variability until defined at a given shop. I propose "Wide Area of Responsibility (AOR) Developer" which, for Acme Corp, might mean "Is competent in writing server-side REST endpoints AND managing development/production database schemas AND load balancing traffic to production web servers" whereas at XYZ LLC it might mean "Can develop UX designs in Sketch to customer specs and then code them with HTML, CSS, and a JavaScript framework along with writing the REST endpoints into which back-end developers will connect business logic from myriad systems based on the contract the 'Full Stack Devs' specified for the needs of the UI."
Just a thought.
-Robert A. Heinlein
Human 2.0 - Sure, why not! :)
impossible is a stretch. harder than it appears perhaps.
If one looks at the original unix devs, this was often the case - modify the kernel to add a new system call so that your runtime system can do X to enable your application to do Y. A true 'sysadmin' in those days was not a pure-IT person, he was an expert of the systems. It is only with the rise of binary-only systems (e.g. SunOS) and IT commercialization that a 'sysadmin' crystallized into a separate pure-IT task distinct from 'developer'.
In my view, what is called 'DevOps' for the operationally focused, and 'FullStack' for the software focused, is really just a return to this mode of operation, which is what a true 'sysadmin' or 'hacker' already was since the dawn of time.
It's been a very strange 10 years to see the title of "sysadmin" start to become "IT button pusher" and the actual skilled role turn to the title of devops.
As far as the move for the word "sysadmin"--no joke, I blame it on Windows and small- to medium-scale businesses. When for a long time the conception of a "system administrator" is "mouse-driven process-follower", a competent software developer who happens to develop systems that throw EC2 instances around just isn't going to want to be associated with that title.
Back in the day these were called Systems Programmers but they’re a rare breed these days.
In my career I've seen maybe four people who can be called system programmers. It's a pity, because there's still so much to build, and it takes a system programmer to spot what ops tools to build, why, and to actually build them.
That's somewhat ironic, since doing development and building software tools in such areas (and system software in general) can be very interesting work: including not just the programming, but also the conceptualization, the product requirement definition, the design, seeing it in deployment and iterating to make changes, add new wanted features, etc.
That has not been my main area of work, but I have some background in it, and have done some pieces here and there (small products or parts of others) and find it to be really enjoyable work. In fact, for many developers, it can be more fun than doing business domain-level development (LOB apps), or social media / consumer apps kind of stuff. I've done some work in all those 3 broad areas, hence the comment.
I usually use the phrases Programmer / Operator and Computing Engineer to encompass the whole shebang.
< Dev who does Operations full time but is not "DevOps"
.. or are we just redefining the stack? I suppose db + api + FE is already a lot to call a full stack, but adding devops (not to diminish it) wouldn't really change the definition of full stack here..
But unless every full stack dev also knows devops, no one will know that I know devops too from my title.
Open to suggestions but until then I'm a "full stack + devops"
Let me pose a rhetorical question: Why have all the hot trends in software project process/management for the last 10 years been so risk-prone to being "done wrong"?
Good question
Why is that impossible especially in the age of cloud? Infrastructure setup and configuration is just another API.
My knowledge of the full stack may not be wide, but it’s fairly deep. If you tell me I have to design and implement a full web application from scratch with no preexisting infrastructure, I can choose a pretty good set of technologies and best practices to get it done as a cloud hosted implementation all the way from net ops, dev ops (CI/CD), backend RDMS or NoSQL storage, a modern server side language, a web server, and a website.
The only part that would be wanting is the website implementation would be a simplistic Bootstrap UI without any modern front end frameworks. The best I could do right now would be either ASP.Net MVC or Jquery + handlebars. But not knowing a front end framework well enough is just because of lack of time to learn and that’s not what I’m concentrating on now.
As the size of the project grew, I would need to bring in specialists for the web (that’s not my forte) and devops (it would be a waste of my time to manage devops/netops) at scale.
And an API which, like all forms of abstraction, falls apart at the seams. There are still networks, interfaces, operating systems, files, cron jobs, sockets, flow logs, ACLs, security holes, and so forth.
Do you, as a developer, want to spend all the time required to keep up with that API? To be the one expected to fill the gaps when the abstraction falls apart? Or do you want to hire someone to take care of that for you?
I don’t want to have to be the only one, but I like having both the knowledge and the access not to have to wait on someone else. I gave up a job as an architect with so much red tape I couldn’t get anything done at a large company to be a senior developer at a small company where from day one I was given admin access to AWS (yes I have the skill set and the certifications for what they are worth).
The same way you don't write, maintain, and extend a thousand lines of IAM policies and roles, network ACLs, and launch configs in CloudFormation templates when you can have a specialist do it for you.
That said, I can understand the desire to gatekeep as someone in an operations role. Our role (as a generalization) is about scalibility, reliability, and availability. Developers (as a generalization) tend to care more about velocity, blue sky projects, and minimizing effort for the outcome.
Maintaining a balance between those two mindsets requires a lot of skill.
The same with devops. I know the devops folks enjoy having sql upgrade scripts and build and deployment scripts (currently yml or CF templates) handed to them that have already been tested in a Dev environment.
Also, if the developer isn’t knowledgeable about scaleability for instance, no matter how many servers you add behind a load balancer, if they store session state in memory instead of using something like ElastiCache, there is nothing you can do operationally (well technically you can have sticky sessions but that’s gross).
Even if the developer doesn’t do every part of the stack, they still have to know how to.
This is a necessity in small organisations and a problem in large ones. A problem because they have to have all the keys, like a janitor; and they tend to end up being treated as either janitors or dictators by the rest of the company. Also tends to have a high "bus factor".
(I semi-jokingly have "Full Stack From the Transistors Upwards" written on my CV, because I have at one time or another in the course of employment done everything from chip design to web design; that doesn't mean I'd be happy to do all of them at once.)
Blaming DevOps (or full-stack, for that matter) for a toxic company culture is just too easy.
So in larger organizations, people can and should specialise more, and not everyone should be "jack of all trades".
But there is an important lesson in DevOps: owning your software from creation through testing, deployment and observing how it runs in production cases, and being partly responsible for handling Operational issues in it has great benefit. It closes a feedback loop that will greatly benefit your software. It doesn't matter if your organisation is large, that learning from the truth of production is still available to you.
What I've learned is that:
1. DevOps is simple to explain
2. For some reason, everyone has their own idea on what it means, and most of them are wrong
Key points from my perspective:
1. DevOps is an evolution of Agile and so all agile practices are a subset of DevOps. This point obviates the need for any points past number 2 below.
2. It's a process which is supposed to get operational knowledge involved in the development process much earlier to build it right the first time
Its over aim is to combat the fact that you can be proficient in only so many things. As you become more specialized in one area, your time becoming proficient in other areas suffers. So a pure dev is unlikely to know much about QA or Hosting, but that domain knowledge would be valuable for them to have in their daily duties. So you try and implement a process by which they have regular access to where that domain knowledge lives, and can make use of it.
It's really just a way of trying to solve the "Jack of all trades, master of none" problem. Put another way, it shouldn't be shuffling more duties onto the dev to save money on headcounts, but a way of increasing the value (not volume) of a Dev's already high-value work.
https://tim.blog/2007/09/14/the-top-5-reasons-to-be-a-jack-o...
The Paint Drip concept has been around for a while now, so I'm surprised people still reference "Jack of all trades, master of None" especially in the software dev industry.
I agree that it's important to be thinking about these future states and having those conversations from day 1. But, I also think that it's easy to abstract away all of the various pieces and dependencies of some application, because we're sold by cloud providers that this design is "reliable" and "robust" and more generally speaking "a better design." But, what if those things aren't actually needed at that point in an applications life? What problem is really being solved if these things don't present a problem? If the application has a few dozen daily users, why is every single piece of it an AWS service vs. a single AWS EC2 instance? It gets even worse than this, of course. I've seen instances where a team of developers had no idea their application was using ElastiCache and experienced application outages as a result of AWS maintenance windows.
Sometimes, I guess, it just strikes me as putting the cart before the horse. And specifically with AWS (but somehow less so with Heroku or DigitalOcean, in my head).
Wow, I'm sooo glad we've come as far as we have. I recall a time where a DBA was literally in charge of creating schemas for a product. Just about everything this person is describing in the article rubs me completely the wrong way. I am all about everyone who can help to try helping. All hands on deck. This article is pretty backwards.
this job-holder is routinely overworked and faces extreme demands on their time, requiring on-site presence both early in the morning and late at night. the job-holder must mediate interdepartmental conflict (two bosses). and there's no path to promotion.
the company keeps losing people in this position. it keeps casting a wider net, bringing in people from further and further away.
this is a solid, successful company with a reputation as one of the very best places to work in the county. but it has never bothered to redefine the position into two or more separate jobs. it's just churn and burn.
i'm not sure what the moral is. managers exploit the labor pool until they can't any more. then they look for another labor pool. if that doesn't work they whine and complain that they "can't find workers" to fill their jobs.
I have 20 years of experience in IT, 7 as admin (ops), 13 in development. I still spend over half my time on purposeful learning and sometimes find mysef out of depth, catching breath. I don't envy noobs who will have little chance catching up.
Most of the time I hear devops it in reality is a person doing hopefully good job in one area and passable in another and relying heavily on others for everything else.
This assume a developer is not a DBA. Or as if you can't be a good one.
I start with FoxPro. So databases is always first for me... to the point that I "mockup" the app with the database schema first.
So, I'm saying that for some people the database -> app is a straight, natural path. DBAs in the past was more about control the access to a central BD in a MAINFRAME. Modern RDBMS are very easy to administer and optimize.
In fact, I think that learn Java, .NET or C++ is far more harder than learn how use a RDBMS in full...
Today, a business analyst has a small idea. She presents it, then gets approval. A product manager works with her on the details to integrate it into the product or operation, and a project manager inserts the idea into the development backlog and prioritizes it. In a few months a developer gets around to the task, spends a day building it, and deploys right away, and then the analyst can measure if it has value. In the future, the process could be, a business analyst has a small idea. She presents it, with a plan on how to integrate it, and get's approval. Then she spends a day or three building and deploying it and then measures if it has value.
We've been optimizing Development -> deployment, but in reality what the business cares about is Idea -> Deployment.
The problem is coding WILL eventually become hard again. If things are developed too rapidly, some aspect of development is going to accumulate error, that's going to be a bottleneck eventually when it comes time to automate whatever architectural layer is being 'left behind' as permanent/vital/intrinsic to system functioning.
It's easy to lose the forest for the trees when so many 'radically novel' tools keep popping up as 'solutions'. There are bugs in all of those things and they will accumulate eventually to the point that the 'ease' of development comes to a screeching halt. The bugs may only wind up surfacing in 'ideas', like the idea that one can forever hop skip jump from idea to deployment. Somewhere, something is always being sacrificed as an expense of getting something straight to market. (Soapbox: The sanity of developers gets relegated as an innocuous and trivial side effect. Just throw more money at it, right?)
I would add, respectfully, that this has been "the future" for longer than I can remember.
But if I'm trying to build some software app in a complex domain, and the infrastructure tooling requires me to configure network routing rules, CIDR blocks, etc., that seems like a huge failure to me, almost like having the developers grow their own crops for sustenance or something, rather than having people specialize in that and leveraging division of labor.
Meanwhile, both the infrastructure and application development frameworks are both getting revved and changed out from under you frequently.
It really made me yearn for just a year or two of competence and productivity on some set task in between having the rug pulled out from under us.
Your infrastructure is part of your software.
is this a realistic cost savings analysis? my impression has been that companies don't hire four developers to do a two-person task. they simply hire one "full-stack developer" to do everything. problem solved, money saved, i'm a great CEO.
When you have a dozen developers working on the same project, doing the deployment yourself is a danger to the company.
For my company, that would probably be a death blow.
How and why? There may come a point where it's worth segregating deployment from development, but I'm certain it's a long way north of a dozen.
Deployment is mostly-automated - put a note in our chat channel topic that you're deploying (or queue if someone else is already deploying), push a button to do a release and deploy as staging (and a small smoke test), do any manual testing (or investigation of logs etc. if something goes wrong), push another button to flip that deploy to be prod.
Any of the 12 devs can do this (and does, we each deploy our own features/stories), any of the 12 devs can make changes to the deployment scripting just like with any other code area (some will be more or less familiar with them, but that's true of any area of the codebase). Nothing unique about it, quite the opposite.
I'm mostly in Ops and I often find myself getting handed something from less skilled developers to run in production. It's frustrating too.
The system I Op runs really smoothly. Problems are infrequent. So instead of spending my time fighting fires, I'm instead working on our next generation infrastructure, running experiments with Kubernetes and Kafka and Influxdb and Elasticsearch.
I'm not developing on our main product most of the time. But I am developing our infrastructure.
As far as the totem pole with developers at the top, able to do all the other jobs? That has not been my experience. In 30 years, working with probably 100+ companies large and small (for 18 years I did contract SysAdmin), I'd say that the developer who even thinks about ops is extremely rare, less than 10%.
I agree that DevOps is more important for smaller companies, and that specialization is useful. I haven't seen evidence that supports the totem pole portion of that post.
When I am working on an implementation that can be deployed with CloudFornation,I create the template test it and hand it over to the Dev ops guys. Even if I’m not doing the actually deployments to any environment besides Dev. I still need to know how to.
The same is true for database deployments and upgrades. How do you upgrade a database through CI without knowing SQL?
Is this really what a full-stack developer is understood to be? I'd always assumed it was just someone who was comfortable doing both frontend and backend development on the same project.
But you lose a lot of expertise when you spread your developers too widely, technology-wise.
If you have a substantive point, give readers enough substance so we know why you think that and can maybe learn something.
This is, perhaps, one of the best metaphors I've read for explaining this concept.
As someone who does one of the "lower" jobs, I rankled at his "hierarchy" of roles notion. Never mind that I probably could write application code if so inclined (and do routinely write "infrastructure" code and sometimes have had to fix those developers' code in production).
I occasionally like to point out to "engineering" or "technology" [1] managers that not all problems can be (or are best) solved with software/code. Some of use, when we digest a problem, can poop out zero or even negative code.
[1] In quotes because they're nearly always actually only software engineering or technology managers.
My previous favorite: Linux is free as in free mattress.