Using “Frontend” or “Backend” to describe the Engineering you like (2020)
michellelim.org
michellelim.org
> “Code-first” engineers are obsessed with the abstractions, architecture, tools and libraries in the code. Elegant code is the end.
Then aren't basically all professional software engineers "product-first" engineers?
Consumers or clients are the users to "product" engineers, who in turn are the users to "infrastructure" engineers. If the infrastructure engineers spend their time building elegant abstractions, tools, and libraries that don't solve the product engineers' problems, the product engineers will get their infrastructure needs met elsewhere (i.e. off the shelve, roll their own, or outsource) and the infrastructure engineers won't be necessary.
(I'm not arguing against infrastructure engineers per se, just that their primary goal isn't elegant code.)
Some people are more motivated to solve the business problem. They may accrue more technical debt in exchange for important features and increasing revenue.
Some people are more motivated by clean, well documented, DRY code. They are probably going to fight to refactor parts of the codebase to prevent losing revenue.
Most people are probably somewhere in between.
There’s definitely a difference between the people who are more interested in the results of programming vs. the people who are really interested in the craft of programming as a process. They both end up having to think about product questions, but they tend to find their way into different parts of the company: the product-focused engineers are always working on splashy new features while the craft-focused are generally behind the scenes trying to figure out a way to make the DX of the codebase better (and sometimes even being called “architecture astronauts” as a result).
That you think I sound like a product engineer when I've been wearing the "I wish we had a real SRE" hat all week is illustrative of the original point: they're not categories that engineers conform to.
Then they brought on a new manager, who immediately ran all my code through a linter and told me to stop all work until the linter came up clean. I told him that I was hired to make working code that solves an immediate problem, and he told me my services were no longer required.
I found out later the project was quickly moved to another team because his team was unable to meet the tight timelines.
In poker, you cannot control the result of any hand -- not even the result of a week's play. To achieve long-term success, you must have a good process for your playing, and not be influenced by the results.
A good process sets you up for the best chance of success, but it cannot guarantee success. If you start to adjust based on results (and not deeper changes to the causal matrix -- these are process-informed changes) you'll do worse. Edwards Deming called this "tampering".
The same thing applies, of course, in business. The greatest process will produce bad results if you're unlucky with uncontrollable external factors. A bad process can by chance produce good results if you're lucky with uncontrollable external factors.
You cannot judge a process by its results in individual instances alone. Judgment of a process must be made in terms of theory, repeated experiment, and long-term tendencies of the outcomes.
And, as in poker, any long-term successful business is process-oriented. They carefully build processes that set them up for greatest chance of repeated success.
Any results-oriented business has -- by de-emphasising the process -- no way to influence the outcome. They are "driving on the highway by looking at the centre line in the rear view mirror" as someone put it.
Theory and process is the only thing that can tell you anything about future results.
I strongly recommend reading Deming's The New Economics.
I'm not sure if my experience aligns with this
I have worked with developers all over the map on these axes and I think the fatal combination is someone who spikes on one axes but ignorance or even active disregard for the other. The failure modes look very different though. The "product-only" engineer quickly whips up something that satisfies their user's need, but over time the code becomes sphagetti that is buggy and painful to modify and the users are unhappy. The "infrastruture-only" engineer makes a puristic system that seems impressive from a technical point of view, but interfaces poorly with the customer's problems. Customers either have to go through contortions to make their problem fit into the architecture of the system or they just move on and find something that is better suited to them.
The second is, ironically, usually the same, but instead of a lack of design there’s a lack of requirements, which is even worse.
If so, why invent new terminology when we have the perfectly fine description "software engineer who is bad at business"? Isn't it bound to confuse more than it helps?
Why don't we go thinking about people strengths and think how we create a team that is composed of people with different strengths?
Manager will have to make sure he makes it clear in the team that:
Joe might not be whipping perfect code but he is good at figuring out users vague requests and putting those into action.
Jane might be obsessed with her language of choice and does not like vague requirements, she likes something like we are having 20 requests per second make system to handle 50.
You don't want to describe people as "bad in something" because that is not productive. For a manager that should be obvious.
But even if someone is working in a team, describing colleagues/projects/workplace in negative ways is bad and not productive. While yes there are instances where it is bad and people should call bad things out, but most of what I see are mere annoyances that one can gloss over.
Even if you have no interest in fixing a weakness, it is absolutely essential that you're aware of it, and can engage in compensating behaviour.
Telling someone "you suck" is not first step to fixing anything.
Just like laughing someones system has so many holes as Swiss cheese.
You want to be specific like you have an XSS here and here, those are steps to fix it.
I don't hold an engineering degree myself, so I am just "programmer". I still make more than most engineers, so why the fuss?
What you have described of an engineer applies to software engineers in Canada. There exist accredited software engineering degrees, some of which may be held under a computer science major with a further specialization in software engineering. There used to be a PE in software engineering in the US. So a parallel for software does exist.
Given that there is precedence for licensing and there exist programs attempting to focus on educating those who need to build systems, why is there such an aversion to hiring those graduates and following those processes? Do they produce worse software? Is there no need because of agile and move fast and ship things?
Company A: A developer just installs and configures off-the-shelf software along with plugins or modules to develop a solution, but they can't really program. A programmer does all the hard work of planning and designing, understanding the system, creating custom code to solve problems, and instructing the developer what off-the-shelf parts to use and how to configure them.
Company B: A programmer just follows instructions from a developer to churn out code, they don't have to solve problems or understand the system. A developer develops the solution, from planning based on requirements, to figuring out the whole system and coding structure and giving instructions to programmers.
Same titles, opposite roles.
Then you get to Comp Sci vs Engineering discussion. That's a whole other can of worms.
Sure, someone might not be doing Big O analysis of a system or whatever. But how often do you really need to outside academia? In a lot of jobs, most performance problems are caused by a few things like cartesian products and/or bad indexes in a database query, or some code that loops doing a query for each thing to fetch data then processing the data, then looping to do additional queries to update the database (when the whole thing could be done with one query, at least with a minor change to the schema), or loops that call a network request for each item. You don't need a detailed theoretical mathematical analysis on a graphing calculator to recognize and solve things like that.
Another is an open endpoint - sure it might not do anything problematic from a security standpoint, and if you set up another system to call it once a day or once an hour it'll be fine. But what if some outsider sets up a system to call it once per second, or a botnet that calls it several times per second? Again, you don't need any complicated formulas to see that that will be a problem.
So sure, there might be some difference in attitude/approach of a comp sci person vs an engineer vs a developer vs a programmer vs an architect. But companies don't know the difference and just give you whatever title they think sounds good. As a pragmatic software person, I don't care what they call me; I just concern myself with whether I can recognize and solve (or better design to prevent) the problems.
Not even going to mention the credentialism regarding degrees.
For a long time, like you, I called myself "programmer", which to me encompasses all of it. But it turns out some business people take a very different view of the terms, so now I just go along with whatever title they want to give me. As long as I can handle the job well, that's what I am.
Conversely, one could be a product-first infra person, who ships widely useful tools but whose code may be of questionable quality (e.g. someone might duck tape together some mission critical CI pipeline w/ python and bash and no tests)
But yes, there are lots of implementors around and very few developers. We currently try to hire a developer and that is not easy.
The front-end/back-end lens can be applied to compilers -- just the "front-end" (invocation options, error/status messages, maybe IDE integrations) is very thin, compared to the "back-end" (i.e., everything else).
I thought the front end of a compiler was the parser and the associated code analysis steps (such as type checking), not "error messages".
But it’s not just word choice bugging me — delivering for clients and writing good code are not orthogonal, even if there’s often a trade-off. Continually delivering for clients is enabled by a solid, well-factored, flexible base. System-level thinking needs both the how and the why.
To me, the split between product and infrastructure is based on who your customers are. If your customers are other engineers within your company, then you're in infrastructure. If your clients are external then you're in product.
I worked on (our product) > Backend, and so whenever the frontend was sending me problematic requests I'd file bugs against the "Backend (of the frontend)". Their UI logic was irrelevant to me, more or less; I only observed their "backend" code's behavior.
Of course when I say I worked on the "backend" I mean the part of this product that talked to other backends and storage layers. In a large enough distributed system, "frontend" and "backend" are relative rather than absolute terms...
Then we had to use javascript to do some frontend stuff.
The javascript became frameworks which templated some of the patterns to make the frontend dev easier (led by React and Angular)
Frameworks like Blazor and Phoenix/Elixir are bringing the frontend dev back to serverside.
If you moved to full server-side tomorrow and used Phoenix/Hotwire/HTMX/whatever, these skills would still be invaluable.
Even if the server is nearby, there's still many things that can add latency, most of which are not controllable (e.g. wifi interference, bad routers, bad ISPs, train tunnels).
So in general you cannot move all functions to the server because it will be terrible for UX. e.g. Google Stadia.
With few exceptions, backend/infrastructure roles will still often involve exposing and designing APIs, CLI utilities, etc
I tend to agree, though. Most times when I talk about frontend vs backend profiles, this is what I actually mean.
Except when I'm feeling snarky, then it's "Backend ;)"
I'd prefer if we go back to the time when "frontend" and "backend" were generic architectural terms. Not everything you do on a computer is a web application.
Don't confuse the sane and stable Internet core protocols with the "web stack".
As a so-called "full stack" developer, every project I've worked on in which the frontend and backend developers were clearly delineated has led to a mismatch in needs between the two.
The frontend devs asking for the API they need for the UI they want to achieve, and the backend devs having to predict the ways the frontend will need this data for now and in the future as the UI evolves and as the backend system is built out.
The frontend devs are at the mercy of potential backend choices affecting the "feel" of the UI over time, and the backend devs at the mercy of their data model, infrastructure, and system design choices not meshing with the future needs of the frontend over time.
I know the projects this sort of thing has gone bad for me on had other communication issues, but I still don't know if I could deliver a solid end product nearly as effectively without being able to jump into either end, understand the problems and desired outcomes, and be able to help both evolve in a maintainable and scalable way, together.
I would even go further and say that when you have clearly set boundaries between teams in functional terms it goes bad. Like "backend/frontend", "dev/qa", "dev/ops" ,"engineering/business".
For me the most effective thing that I see are cross-functional product teams that have their own goal to ship things and all roles within that team.
Unfortunately not all software can be built that way and there is a lot of productivity loss, because you might not have enough work for some roles. Like ops engineer you will need at the beginning to setup infra and then he might be helping out here and there, but it is not going to be full time job on one project. Then QA might have "quiet days" because devs will have to work on things for couple days before delivering something.
I understand huge enterprise companies that they want to have "QA" "Dev" "Ops" just as a pool of reusable people, because they have to hire them full time and keep occupied.
What I see in the wild is that there are some long running projects that evolve all the time and those can be such teams as described earlier. There are ad-hoc projects that might pan out or not, maybe it would be better to hire freelancers, see if project turns into long runner and if yes, hire a proper team to work on it.
All of that requires unfortunately a lot of knowledge and work and a lot of political power inside of a company...
> “Code-first” engineers are obsessed with the abstractions, architecture, tools and libraries in the code. Elegant code is the end.
Eh, from my experience it's quite the opposite, if we're talking frontend vs backend. Frontend is a complete abstraction these days, all about the tools & libraries, a bit less focused on sound architecture, and usually the only thing elegant is the cursive font JS devs use in VSCode.
In my experience though, the problem is that the premise of this article presupposes a large enough, diverse enough engineering organization. For smaller shops, there may not be such a thing as a frontend architecture oriented role, or there may not be upper management support for infra oriented roles, etc.
After being here for a while and speaking with recruiters from other companies, I've really grown to dislike describing myself as "backend" since I have to make myself explicitly clear that I do not want to work on "backend" portion of product and enjoy myself in the infrastructure side of the world.
* product-first engineers have been tamed by the company and can be expected to obey orders and perform tricks for rewards (money, coffee, biscuits, etc). For them code is just a means to an end because they have strayed from the path.
* code-first engineers haven’t had the love of coding slowly but inevitably squeezed out of them yet. Companies hate them because they’re more interested in writing code poetry than working on their assigned widgets, as any good product-focused engineer should.
I think the distinction usually comes from a lack of familiarity but is reinforced by the reward you get from solving the puzzle you care about.
I don't read it as something "true" or life changing. But it still is interesting enough that it sparked conversation. Conversation on the topic I am interested in and I am happy to read the comments on the topic here on HN.
Beauty of things going viral is that someone who is not an authority figure can share interesting thought that will be passed along.
- see programming as an obstacle.
- hate programming.
- never talk about technology.
- care about marking tasks as done.
- think that there are more important things than uptime.
- get favored by task-oriented managers and may get promoted to roles they may not be able to successfully interview for.
- their success encourages other engineers to be sloppy.
Real engineers:
- see programming as part of their job and try to be competent at it.
- have a passion for what they do and how they do it.
- can have an interesting conversation about technology.
- care about sustainable productivity and managing tech debt to achieve that.
- recognize that without uptime, the product doesn't exist.
- get passed on promotions by task-oriented managers.
- their success encourage other engineers to pursue excellence.
There are frontend engineers and product-oriented engineers that care about their craft and are knowledgeable engineers, but it's not a requirement. For infrastructure roles, a desire to understand things deeply is required.
> “Code-first” engineers are obsessed with the abstractions, architecture, tools and libraries in the code. Elegant code is the end.
I work on infrastructure products. You'd be hard pressed to convince me that my SDKs don't "solve user problems", because they do. Sure, frontend and backend aren't great descriptors. I often lambast "backend engineering" when a company has a unified hiring process and requires me to recruit the people who do the kind of work I do with the way they recruit web-only backend engineers, but these descriptors are far more amalgamous and tell me much less than what Frontend and Backend do.
False dichotomy. "Problems" are difficult to put in meaningful frames, and the engineering value is proportional to how "meaningful" the problem definitions are.
Users experience things they identify as problems, but can't possibly articulate in meaningful frames.
Users only experience symptoms, whereas engineers are responsible for systems. The shortest path to treating the symptoms is almost never a good solution, for either the user experience or the system.
In so far as there are different types of engineers, it might be possible to segment them based on their accountability. Some are accountable only to user demands, some are accountable for long term system stability, and so on. They are not "born" with different mentalities.
Personally, I find myself split between liking both (and being frustrated by both). The frontend/product stuff is the kind of stuff that’s easily explainable to grandma (“hey look at this button! I made that!”) but at the same time, “pixel twiddling” (spending hours just to combat weird issues in CSS leaves a spire taste. The backend/infra stuff is often much more “challenging” in many ways (not to say frontend is “easier”), but there have definitely been times at the end of a long day of work where I’m not really sure what I had to show for it.
I describe myself as a backend engineer, and I refuse to touch your legacy frontend code or own any frontend code.
If you are unable to understand it, companies that do are a dime a dozen in the current market.
True, but it’s useful to describe skill sets. They are truly quite distinct and equally challenging. Full stack is also useful because it means “I can muddle though most of it” — written as a muddler myself.
You don't want me doing frontend development.
I don't want me doing frontend development.
I struggled doing frontend development back when it was 80x24, with green, bold, reverse, underline and blink. On a good day I got the fields lined up.
I can do frontend development, but, you won't like it.
When people say they don't like frontend, they just mean they don't like implementing GUI designs as opposed to CLIs, APIs, and all the other kinds of non-visual interfaces. And why would anyone enjoy translating existing designs into code. It's rote and finicky; there's little scope for creative decision making and few hard logical reasoning problems to chew on (note that I'm not talking about architecting complex async business logic, but just the translating design specs into HTML&CSS part of the job). Also, CSS is an unholy abomination that is absolutely disgusting to work with
Implementing the designs should be part of the designer's job. That should be the price they are required to pay for getting to do the fun creative part. It's also more their speed as coding goes
if it runs on the server it’s backend
if it’s about actually running the server it’s infrastructure.
i dont see what’s that hard to understand…