Dividing front end from back end is an antipattern
thoughtworks.com
thoughtworks.com
The thing is front end dev is actually very different from back end dev. Having done a lot of both, I can say that they require very different skillsets and different knowledge, so it is quite normal that they're not done by the same people.
Now, if your team is frontend first, you'll likely screw up your backend design in the sense that you won't be able to define a nice API for it. Similarly, if your team is backend first, you'll have a nice API, but probably won't think about all the frontend needs, and will have to patch things nastily down the road.
Truth is, coordinating people with different skills is hard.
Now this kind of articles take aim at teams that don't manage to make it work. So yeah, not being great at managing teams is an antipattern...
I've seen this argument many times, but as someone else who has done a lot of both, I've never really understood it. It's just programming, like any other software project. Sure, you might use different languages and each might have its own tool chain, but unless you're using radically different languages or tools in the two cases, those are probably superficial differences. Most experienced professional developers can probably work in several languages, and you pick up a new tool chain in days if you need to. But the fundamentals of programming are still much the same whatever you're building. Certainly different applications also have different knowledge and skills -- writing a business automation tool is likely to be quite a different experience to writing a control system for ABS in a car, say -- but for a typical web app, the front and back ends are usually going to overlap a lot in this respect.
As I mentioned in another comment, the huge exception to this is junior roles, because at that stage in someone's career they probably haven't gained much diversity of experience yet and you probably should start by focussing on one particular aspect. So if your project team consists of many relatively junior people and not so many seniors with broader experience, sure, you're going to put most people specifically on front-end or back-end, at least to start with.
I think the real distinction here is between programming and interface design, which are also separate skills that any given person might or might not have, but that is true whether they happen be coding for the front or the back end at the time.
The webserver code that renders web pages definitely belongs to frontend dev.
Maybe this explains the difference in our perspectives. To me, other than perhaps the very first data collection where maybe the source is only accessible from the back end, whether things like statistical analysis or rendering of the results happen on the front or the back end is something you will decide on its merits for each project, not something that is necessarily tied to the mechanical programming skills or libraries on one suffer or the other.
For example, say you're working on a web app that controls some device. On the back end, you might not be talking to a database, at least not in the sense of SQL or NoSQL we usually mean in the context of web apps. Maybe instead you're integrating with some internal API that controls the hardware.
In that situation, maybe you're exposing that internal functionality to the front-end web app via some HTTP-based API, which might be substantial but is mostly a wrapper for the internal functionality with things like security incorporated. Who should be responsible for that middle layer? Do you have a separate person/team whose responsibility is just to bridge between the front-end code and the internal API? Should the person/team responsible for the front-end also be responsible for the HTTP-based API it talks to, and hand off to some other person/team who work on the hardware-facing code behind the internal API? Should the internal team also be responsible for the HTTP-based API?
I don't think there are any "right" answers in a situation like this. You probably have people with front-end skills. You probably have people with low-level hardware hacking skills. Some or all of those people might also have back-end skills. You've certainly got three distinct but related areas here. Depending on the project and the mix of people you have available, there are several potential ways to handle this situation that might be effective.
The opinion I've adopted from my designer friends, though, is that once you have a designer in-house and the site's basic design has been established, what is more important is that the developers notice and care about details. That's not something I would consider a frontend vs backend developer trait, just more of a general engineering attitude. Do you notice that the padding here doesn't match up, do you question why this form is laid out differently from all the other ones, how does this flow from page to page work, do you go find a designer and work with them until it's right.
I would posit that the same person who cares that the UI is consistent and makes sense would also be pointing out why is our code formatting all over the place, why we use different libraries in different places to do the same thing, why our patterns and architecture is inconsistent. If you just copy/paste in random UI pieces and call it done, then you're probably also copy/pasting in random stackoverflow snippets on the backend and just recompiling until the tests pass.
If you're building a relatively simple UI, using common features like buttons and text boxes and maybe some simple charts, you might well do what has been mentioned in this thread. You can identify reusable pieces that the designers can use to define layouts and specify styling and that the programmers can use to implement those things in code. This is an easy method of UI design and implementation, and often it is all you need.
If you're building something more challenging -- a rich document editor, a game, an interactive 3D visualisation of a complicated data set, basically anything that isn't just a combination of standard controls and UI patterns -- then the main part in your UI might not fit that component model very well at all. Now you're going to have to approach both the UI design and the programming from a different direction, just as you would in desktop, mobile or embedded software. This is harder, because you're moving away from patterns and tools that are well understood and readily available, and instead you're building something original. However, it's also much more flexible for the same reason, and sometimes that's what you need.
Even in the latter case, you will often need standard features in your UI that can be designed and built as individual components as well. There's no rule that says you can't have a hybrid with both reusable components for the simpler, recurring features and then one or more features that are more sophisticated.
At the very top of each field, sure, there will always be those specialists who live and breathe that subject and can do the things no-one else can, but most people will never achieve such proficiency in any field during their career and most businesses will never hire anyone on that level, so I'm not sure it is going to generate much insight to talk about extreme cases. For anything below elite levels, you certainly can have the same person with expert skills in both front- and back-end dev, or in back-end dev and DB admin, or in front-end dev and UI design, or just about any other combination of relevant skills.
I think the problem here, though, is trying to overgeneralize. I've worked on projects where you want to split things vertically (apps / plugins / etc. which have isolated functionality and handle back+front end), and horizontally (front-end / back-end split).
That comes back to what the system does, as well as the make-up of the team (full stack developers will do different things well than teams of specialists).
The danger comes in when you try to mix pieces of the two. I had a system with a simple, elegant architecture with a vertical abstraction. A junior engineering team came in, who had only seen horizontal abstractions. They didn't understand it. They didn't get functional code either (they had only seen OO). They decided it was all very confusing spaghetti code, broke all the vertical abstractions, put in half-done horizontal splits, and the system became unmaintainable.... You can blame that on junior team from the high-level descriptions, but the deeper problem for that system was mixing abstractions and programming models.
Of course someone might have both front-end programming and user interface design responsibilities on the same project, but I would no more assume that than I would assume the same person would have both front- and back-end programming roles, and the skills for the latter combination are much more closely related. My point here is just that everyone has a different mix of skills and trying to pigeonhole people or restrict anything to only certain combinations is not necessarily either realistic or helpful.
It doesn't matter if the underlying programming fundamentals are the same because the human brain still has preferences on what it wants to work on. The mistake is applying some "umbrella term" (i.e. "programming") for an activity and thinking that will automatically make all sub categories attract the same interest level. It doesn't work that way.
This same phenomenon happens in other intellectual activities such as mathematics, writing, painting, etc:
One mathematician might prefer to study algebraic topology while another mathematician prefers to work on number theory. Thus, saying, "I don't get it -- it's all _math_ so why should one person have more interest in one branch vs another?!?" ... does not remove the preference.
One writer may prefer to write political analysis essays and never writes fiction -- but another writer prefers to write fiction and never opinion pieces on current events. Therefore, saying, "I don't get the fiction/non-fiction dichotomy because both activities are just the same task of manipulating _words_?!?" ... doesn't make a preferred interest disappear. Yes, some authors write both fiction and non-fiction but the existence of them still doesn't remove the preference of other authors who specialize in just one. Even within sub-category of fiction, you get sub-specialization of "mystery novels" instead of "romance novels".
Likewise, saying "painting is painting" does not change the fact that an artist might prefer to always paint landscapes and never horses or people.
>It is becoming clear to me that much of the perceived difference of opinion here is just because of terminology. I was thinking of "development" as meaning specifically the programming side of things. [...] and trying to pigeonhole people or restrict anything to only certain combinations is not necessarily either realistic or helpful.
Some people naturally just want to pigeonhole themselves. I've done frontend work on old DOS machines (text-based UI), raw Win32 API, VB/C# GUI forms, Javascript/HTML -- and I don't like any of it. I prefer to program the backend algorithms. Yes, coding a loop to "iterate through all window controls to enlarge them by 10% in the GUI" has something in common with "iterate through all nodes of a graph to optimize a path" ... because they're both "loops" ... but they have very different levels of intellectual satisfaction. I won't argue with you if you feel that they should feel exactly the same because they're both "programming" but I can't help it that I don't derive the same enjoyment.
If I was employed by Google, I'd enjoy working on the backend ranking algorithms. To a lesser degree, I'd be ok with working on the spider crawlers. But I'd quit if they assigned me to work on the web frontend where users type in queries. But I'm also glad there are developers who prefer to work on the frontend instead of the backend because it allows people like me to stay with my preference.
My objection is to the common arguments that front-end and back-end dev are fundamentally different on a technical level and/or that they should be done by different people or that the same person can't be good at both. Compared to other programming fields, such as traditional desktop applications or embedded real time systems, front- and back-end on the web are quite similar in the skills and technologies they use, and I don't think drawing a clear line between them is very helpful (that is, I agree with the original article that started this discussion on this point).
back-end: perhaps less, uh, dynamic, but: db architecture, SQL, much more CLI/linuxy stuff, server security, API design, version control, deployment, containers, ansible, load-balancing, nginx config...
The difference not primarily being a sort of 'core' skillset, but rather purely learning and remembering the intricacies of all these things. That's too much for most people.
EDIT: I find that there's a definite sense of 'progress' or 'leveling-up' in all these areas put together. I get better at finding the right documentation, finding the best places to go for help, figuring out what the foot-guns are as well as distinguishing fads from truly worthwhile developments.
I get better at 'intuiting' where I might need to take a deep dive to truly understand things, or where I might need to consult an expert.
It gets easier to take lessons from one area and apply them to another.
But ultimately there's still so much 'domain knowledge', much of it shifting and changing, even if just because the client cares about it, that it's hard to keep up in both the front- and back-end world. And even if that shouldn't have to be necessary, in practice it often is.
For example, I've been doing more back-end stuff for the past few years. I keep an eye on what's happing in the js/React world as that is what I mostly did before. I struggle with setting up a new project because apparently Webpack changed, apparently we do CSS in js now, and apparently hooks are the hot new thing. I have a /lot/ of time to study all of this, but unless I actually work on a project that uses all this fancy new stuff, it doesn't really properly become part of my skillset.
The same goes for backend stuff. I can set up proper Linux servers 'in anger', but apparently now it's pretty useful to know how to use Amazon/Moft serverless stuff and I just never got to that. And I'm single and almost permanently reading up on all this fancy new stuff!
I don't think you can break things up like this. Good developers can work one, sometimes two layers in each direction. A back-end developer who can't design a database is a lousy back-end developer. A front-end developer who implements user interfaces handed over from a designer is a lousy front-end developer.
Pigeonholing people isn't helpful, but it is helpful to
(1) Recognize that there are distinct, deep skill sets
(2) Known when and how to organize teams and software. Some benefit from vertical splits, and some from horizontal. There aren't universals here.
I'm just arguing, following the spirit of the article we're discussing here, that there is no inherent reason the same person can't have both front-end and back-end programming skills, and can't perform both of those functions proficiently.
Of course there are many non-programming skills involved as well, but I don't accept your premise that a back-end developer should necessarily know how to design a database or that a front-end developer should necessarily know how to do all the design work for a UI. Plenty of web applications aren't backed by a database at all, so the first claim is clearly not universally true. Plenty of organisations have people dedicated to their design and branding, and that might be shared across all media, so again it's clearly not always the case that someone doing front-end programming must also be able to handle those aspects in order to be competent or useful.
Given that front- and back-end programming are much closer in the skills required than either is to user interface design, graphic design, creating digital art, understanding accessibility and usability issues, designing and maintaining an efficient database or system administration, among other relevant skill sets, it seems entirely reasonable to me that a project might want to have the same team responsible for all programming, and have different people doing things like the UI design and the database and system administration. Another team might have people with different mixes of skills and might use them more along the lines you described. All projects and all project teams are different.
"Of course there are many non-programming skills involved as well, but I don't accept your premise that a __junior__ back-end developer should necessarily know how to design a database or that a __junior__ front-end developer should necessarily know how to do all the design work for a UI."
I agree with this for a junior developer working on a simple project:
"Plenty of organisations have people dedicated to their design and branding, and that might be shared across all media, so again it's clearly not always the case that someone doing front-end programming must also be able to handle those aspects in order to be competent or useful."
But a senior developer working on a complex project should be able to work a couple of levels up and down wherever they are in the stack:
* If building a complex web app (e.g. Google Docs an online game, etc.), there isn't a clear separation here.
* On simpler projects, even just implementing corporate branding from a designer, little pieces of cross-cutting work come up.
* Even where there isn't cross-cutting work, being able to leverage synergies requires people to be familiar with both domains. If a designer comes with a design, and the engineer can modify it to be 90% as good (or sometimes 110% as good) for 50% of the effort, that's a conversation a senior front-end developer should be able to hold with the designer on relatively level ground (e.g. know the jargon, constraints, modes of thought, etc.).
There are jobs for full-stack engineers, and I agree with your current comment ("it seems entirely reasonable to me that a project might want to have the same team responsible for all programming"), but that's a few steps divorced from your original claim ("'ve seen this argument many times ... I've never really understood it. It's just programming, like any other software project. Sure, you might use different languages and each might have its own tool chain, but unless you're using radically different languages or tools in the two cases, those are probably superficial differences.") Since you said you never understood this argument, I thought I would elucidate.
I've worked with really good front-end people, and really good back-end people, and it's an entirely different skillsets. Beyond the (relatively junior) skill of being able to write code and understand a "for" loop, the more senior level stuff goes off in two deep and very different directions.
It's definitely different for junior positions, when someone hasn't had enough time to build up a breadth of experience yet and getting to a useful depth of understanding in at least one area is more important.
FWIW, I also think it's different at elite levels. If you actually are the person who had to, say, develop a data storage system for Facebook at a scale no-one had ever done before, you're probably a database specialist with skills and knowledge in that area far beyond any generalist's. But these positions are rare, as is the need to have someone with that level of specialist skills on your team.
For seniors at a high but not exceptional level -- that is, the most senior people you're likely to find in most organisations doing web development -- it's definitely normal for someone to develop both breadth and depth of skill and understanding throughout their career. No doubt many front-end developers (in the programming sense) do also have some level of ability with design work, and many back-end developers (ditto) do also have some level of ability with database design. There's certainly nothing wrong with that, and it's certainly helpful to have that level of understanding whether it's to use the skills directly or just to communicate more effectively with a colleague who has responsibility for that aspect of the work.
The only area where perhaps we would slightly disagree is in the idea that being a senior front-end or back-end developer necessarily requires advanced skills in specific related areas as well. The industry is huge and the number of related skills that are potentially useful is large, and which ones are useful for a particular person playing a particular role can vary widely.
For example, I've met someone who is very capable when it comes to writing server-side code yet who as far as I know has never touched a database in well over a decade. Their speciality is interfaces for network-connected devices. While a recent project for them might well have had a snazzy SPA on the front-end and a super-dooper GraphQL API running server-side, what is behind that API is probably nothing like a SQL or NoSQL database at all. On the other hand, they probably know a lot more about calling local C APIs from server-side languages like JS or Python than most. I would certainly call that person a senior level developer -- I doubt there are more than a few thousand people in the entire world with the combination of skills and experience they have, maybe not even that many -- but it seems they would not clear the bar for you because they lack significant database expertise?
At least in companies I've been, someone who can code but cannot design a database, that's a junior backend position, no questions asked. Likewise, someone who can code, but can't do UI/UX design work, that's a junior design position, no questions asked.
I think one issue is that if someone has depth in algorithms, computer architectures, and similar, becoming a competent DBA isn't too much work. SQL isn't rocket science, and neither is how databases are organized. If you don't understand B-trees, have background in what sorts of operations to nanoseconds, microseconds, or milliseconds, cache hierarchies, and so on, that's a pretty generally-applicable back-end data set, and you can pick up databases in a few months. That's something I'd expect a senior back-end engineer to have done at some point in their career. If not, I'd hire them in a more junior role, and then advance them quickly. Coincidentally, with that skillset, you can also design something new, like that Facebook back-end. That's also what FAANG interviews try to screen for, although they've had the narrowing effect that people try to master FAANG interview questions, without necessarily that depth.
In line with that, I also don't think positions like the Facebook one you described are rare. A lot of positions I've seen require that level of background. I also think you underestimate the number of people at that level.
Yes, I have seen "senior engineers" who tend to be more biased in doing back-end or front-end work, and in some cases, those same people actually prefer one or the other, too, but to expect them to be ABLE to work efficiently up, down, and around the entire stack vertically and horizontally is not at all unreasonable. And yes, you have to know "a lot" to get there but that's what years and years of experience gives you if you have successfully built working software for a long time.
I'd expect senior folks to be able to not get confused by an HTML tag, of course, and to be able to build a good end-to-end system, but the really good front-end devs I've worked with think through really subtle details of interaction design -- how long a slider slides, subtle changes to colors during mouse-overs and other actions, and just thousands of details that make a world of difference in how the product feels.
Conversely, anyone who's coded for more than a few years should be able to do a database query. But a really senior back-end dev will be able to think through how to, for example, make an architecture capable of streaming through thousands of events per second with 100ms latency, how to shard a system to work in data centers around the world to maintain data coherence while minimizing user latency, or hundreds of similar complex algorithmic tasks.
There are plenty of full stack people who can make an app responsive, have a coherent SASS/CSS framework, and efficiently organize a typical database (I can do all of that too, for that matter), but doing either side well takes many years of experience on its own.
There are times to go with a generalist. And there are times to go with a specialist.
I've worked with really good senior engineers, but part of what made them good was that they /weren't/ getting involved with the nitty gritty of centering a div or making something work cross-browser. This was the domain of the front-end-only masochists.
I sort of consider myself a full-stack developer, but I'm quite aware of the lack of 'stuff I should just know' in all the stuff involved with that (devops, front-end UI/UX, front-end 'making it looks right' CSS/HTML, back-end DB design, back-end application structure, etc.)
My 'broad' knowledge is perfect for many of my clients, but I wouldn't sell (or guarantee quality) to anyone demanding proper expertise in most of these particular areas. I'll probably fuck up something setting up the Postgres db that only becomes apparent under high load. I might forget some crucial element about hardening the server(s). My JS knowledge is probably already out of date because the last time I did serious JS development it was Webpack with React (without hooks) and mostly no css-in-js. I'd probably still pick sass/scss for comfort. And webworkers are fascinating but I never got to it.
Now I'm pretty smart, and as an autist I spend what my therapist would consider potentially an unhealthy amount of time reading up on ALL of this stuff. My work is my hobby. As I'm nearing my forties I'm definitely giving that some thought, but I digress.
My point is that except for a few unusually gifted people, I find it truly hard to believe that it's possible to be a full-stack web developer who is actually /skilled/ at all parts of the stack. There's way too much domain-specific knowledge (that is constantly changing and evolving) for a normal human to be able to stay on top of, let alone be an expert in.
(again, with some incredibly impressive exceptions).
When I was a junior programmer doing my first job, I knew exactly how to check the length of a list in the language I was using, and hundreds of other everyday little details like that, without needing to look anything up. But back then, I was only using one language, and I was mostly doing basic implementation work all day.
Fast forward a few decades, and I can't always remember those little details any more. Sometimes I get them wrong or have to look them up. So am I a less competent programmer than my junior self?
Of course not. It's easier to confuse details like that when you've seen subtly different versions of them in each of the dozen or more languages you've programmed in professionally. But is it really important to remember many variations of each of a thousand little programming tasks, when I can look them up in moments if I haven't used them for a while and then need them? Would that really be a better use of my mental abilities than understanding what makes a good abstraction or how to evolve a useful software architecture or how to develop a robust testing strategy or how to quickly recognise a missing edge case that could lead to a bug or how to design out that edge case in the first place or how to find or build tools to help?
The reality is that Me 2020 Edition would outclass Me Junior Edition by a huge margin in any skill that matters: productivity, code quality, communicating effectively, anything. The extra depth of understanding and breadth of knowledge far outweighs the trivial effort of looking up a detail now and then if I'm starting to work on something with a language or library or tool I haven't used for a while. Those little details are superficial, and it's the more substantial changes that really dictate how effective I am.
In fact, I'd argue that a pretty good benchmark of someone's level as a developer (and probably a lot of other things, too) is where their threshold for something being a superficial detail lies. What areas of understanding are so simple to that developer that they don't need to know or remember them, they can just pick them up quickly and reliably on demand whenever they need them? To a junior front-end developer, that might be things like learning the DOM elements for semantic markup. To a more experienced developer, it might be remembering how `this` works in JavaScript. To a more experienced developer still, it might be entire libraries and frameworks: it doesn't matter much whether your project using Angular or React or Vue or TheNextOne if they can just pick up whichever it is and be using it fluently within hours anyway even if they've never touched it before.
Ah, yes. Quite.
Or you have a horrid kludge, and regardless of how great your frontend team is, you are now stuck with a terrible mess.
User-facing applications just have different goals from an application consumed via API. Practically when you split up a system into a client facing application and an API application, from my experience and reasoning, it's always been because it results in a far easier to manage development process.
The simpler you can make your system the less likely it will be to fail by any measure. So breaking systems up into smaller systems is just easier and simpler. One such division that is really easy is the backend and frontend.
Model View Controller type frameworks are a great practical example of why breaking systems up makes them much easier to construct.
The skillsets of definitely different though and they both compliment each other. I'm really not a fan of having 'full stack' engineers which do everything. The truth is they are often stronger in frontend or backend, with a few unicorns that excel at both. Frontend engineers know frameworks well - angular, vue or react with other frontend concepts like cookies and frontend security. Backend engineers don't need to know about cross-site scripting, CORS and a bunch of other things that have been standardised and built into browser security.
Backend engineers have used more languages outside of javascript and work with a much larger set of technologies day-to-day (databases, queues, file systems, other APIS, RPC etc). They see the client (frontend) like any other consumer hitting their system.
They can't be unified because tech stacks and the web is so big and there are so many ideas and new things coming out. I'm not sure if a browser could ever do something like reading a message from a Kafka topic. A frontend dev should never have to worry about that, so why on earth would they ever need to know anything about Kafka? A backend dev might have to play with it though.
> To be clear, I’m not saying that we all need to be experts in everything. That would be impossible. Today’s technology stack goes down a long way, so being a genuinely balanced full-stack dev is probably not the most realistic of goals — but staying open-minded is.
I think things might get closer and closer together. At least in the JS community. Performance critical work will be done in Rust / wasm and we will always have people who specialize instead of generalize across all these technologies. But that doesn’t mean some projects can’t be unified more!
I agree that frontend and backend development are deep enough on their own that they require specialization for complex projects. But lacking even basic knowledge of how other parts of the stack can by an issue IMO.
You mentioned CORS for example. One time I had to explain to a co-worker, who was a senior level backend dev, why the browser’s calls to his API were failing due to CORS. He couldn’t understand why the fix had to be on his end. When he tested the API with Postman the same requests were succeeding after all. It was shocking to me that someone at his level was not familiar with what was happening. Sure, it requires knowledge of browser behavior but it’s still relevant to the person writing the API.
Beyond that, I find that having a little full stack knowledge helps with inter-team communication.
It's the engineering/architecture problem. There's no reason why you couldn't build a proxy on the same domain as your front end app and proxy the request to the backend.
It sounds like his interface (API) was built before you even started consuming it. Maybe adding such headers increased the scope of complexity for his API and tests. I don't know the circumstances, but I disagree the fix HAS to be on his end.
example: what if you need to limit API calls, or stream data in a specific way? what if you need to work with the back-end to pre-fetch certain data and then cache it client-side?
I'd argue these things are back-end-interacting client-side code. and they should probably be written by someone with a strong appreciation of the back-end, whether than be someone actually on the BE team, or a knowledgeable FE team member.
Of course, you can always write a spec that covers all of it and bounce it between the two teams, but that doesn't always work out well, especially if FE/BE silos have developed.
One or two devs knows the other teams stuff? The whole team?
also, what does it mean in the context of "different skillsets"? It sounds like the FE devs has some comprehension of the BE, but weaker skills than the BE devs. Then cross-functional just means not strongly siloed, but what is the advantage is that? a little knowledge can be worse than none.
KT can be expensive, specialism exists for a reason, and you can end up limiting your hiring pool if your requirements are too strict.
I don't think a FE team needs every member to know every detail of the back-end, a suitable abstraction can simplify how much you need to focus on the back-end detail.
Instead I'd advocate having a few "specialists" that have a good knowledge of where FE meets BE. they needn't be the best BE or FE dev, but the best at integrating the two; I'd say this is usually a BE engineer who can write good JS and has a decent appreciation of the relevant protocols. They can architect the main touch points, and then abstract them (i.e. create relevant classes) for the FE, BE. These devs would be competent experts in integration, rather than the "jack of all trades, master of none" full-stack variant; a shallow but wide knowledge may be great for prototyping, but not for mature stacks.
I find it really baffling how much animosity there is towards front end. Nobody goes out hating on back end. If I had to guess why there's so much hate, I'd posit lack of control. Front end development requires relinquishing a lot of control. You can't really choose your programming language. You can't choose your styling language. Often times you're being told how something should look by a designer, which can be a bit of a blow to the ego. Being ordered around by a gasp artistic person. The horror.
Even if you get to decide how things look, that's even worse in some ways. I know I've spent hours slaving over designs that just don't look good. Maybe you give up and resort to Bootstrap/Material Design, but that certainly feels like defeat.
I'll admit. Front end takes some acclimation. I hated debugging JavaScript for the longest time. But with modern tooling it's quite nice. Plus there's something really amazing and challenging about having real, non technical people interact with your code. Only developers will notice an API bug, but everybody will notice a client side bug.
A few years ago, I built a small project using Nunjucks templates that needed translations. There were a half-dozen different ways of extracting translations, and most of them required some form of manual work. Coming from Django, with a single best way of handling translations, this was annoying.
I prefer “batteries-included” frameworks that let me focus less on foundations and more on the actual business. Angular was the only framework I used that resonated with me in this fashion.
Now I use React, and spend most of my time debugging tests.
I just want to get started with something quickly, not spend hours or days (when I'm doing something on my free time, not at work) reading about different libraries or plugins that I have to choose from, to accomplish something seemingly trivial.
> you're being told how something should look by a designer, [...] Being ordered around by a gasp artistic person
Neither are very relevant. UI interface design is about supporting workflow. Visual appearance is not unimportant but it's shallow.
> about having real, non technical people interact with your code
yeah, that's how you do it! Assuming your company actually does UI testing at all.
I don't think it's shallow, it's actually taken for granted. Look at how vertical scrollbars work on both mobile and desktop, for example.
We don't give it a second thought, but imagine how many layouts would break on mobile, with a default 20px scrolling rail on mobile browsers. Or the way the URL bar hides when you start scrolling.
Those kind of ideas, from my experience, rarely come from product developers without some visual design experience.
While there is some use of JavaScript at the backend, IME it's much less that other languages, so backend developers are used to "better" languages with actually useful standard libraries (C#, F#, Elixir, Ruby, Python...).
Of course, JavaScript is evolving, albeit slowly, and recently TypeScript helps somewhat. Web assembly may eventually offer a real alternative, but I think we're still a long way front it becoming mainstream.
I think the truth is, most engineers just aren't comfortable with A) working with stakeholders and translating requirements to specs, aka soft skills, B) any sort of design (which is actually hard!) or C) learning the HTML/CSS/JS ecosystem. Also, I found learning how to write frontend applications to be just as challenging as writing CRUD apps.
The HTML/CSS/JS ecosystem is hard, props for that, but then it's made harder by being reinvented every year by the latest fad.
Deal with and pre-empt cross-browser compatibility issues, ensure accessibility, iterate on the UX, deal with stateful-but-not-persisted applications, optimise for constrained devices whose hardware you do not control... And keep up with whatever technologies exist to help with those challenges.
The article even mentions some of these. Yes, you could just say back-enders should know about all that, but... There's a limit to how far a single human can vertically integrate their knowledge. For example, the same argument could be used to claim that 'developers' should be able to handle all the challenges of the back-end, of database adminstration, of operations, and why not, let's throw in business development, design and content strategy as well.
In the end, it mostly depends on what you can afford. If you're a small, bootstrapped startup, you have a couple of people doing everything. But as you grow, specialisation can become more efficient.
No, they don't. The application is persisted. The store is one or more external resources, but that's usually the case with persistence, even on the backend.
Frequently some or all of the state is persisted to a datastore, whether client-side or backend (which of those isn't really a substantive difference in the skill involved, except that backend stores make planning around communication failures more important), and even when it's not, “my internal data structures don't also get loaded from and saved to an external store” doesn’t add any additional required skill, it strictly reduces the set of skills that need to be applied.
It depends. Funny how such an indiscriminate answer is so acutely accurate.
Both sides (all sides really — hello devops), should have an appreciation of the other.
But so much depends on team size. 3? 30? 300? 3000? 30000?
When a company is young, you hire generalists. Fullstack. But as you grow, the dynamic changes. Fullstack devs end up doing more one side vs the other. You hire more specialists.
Team dynamics, engineering structure, product embeds, matrix orgs... so much can have an impact. What is your ratio of senior to junior? Do you document like a remote first? How orthogonal is your problem space? So many things. Not taking them into consideration is the real antipattern.
Conway's Law etc etc
Not impossible to achieve, since frameworks/methodologies are transferable. I.e., I use React, but I learned Angular2 in just a day or two and was able to be productive right away for maintaining/building feature in some apps that use Angular2. Backend we use Express, Flask, plain Go. ES, SQL, MongoDB, DynamoDB. Doesn't matter. Granted, everyone in my team are senior devs, more than 5+ years exp.
Besides, after a while doing just frontend or doing just backend you'll get tired and sick of it and want some change. It is nice to just flip back and forth, do database today, do css tomorrow, do API the day after tomorrow, do buttons and forms next week.
We don't do Kubernetes etc though, too complex. Just plain old Ansible Jenkins on real machines. And when we can, just use managed services.
I'm in the latter camp. I gave up, I can't compete with good frontend devs. But I've yet to meet a good frontend dev that competes in my domain. I really think the two take different mindsets.
That said when I say I'm full-stack I say there are parts of the stack I am more comfortable with than others.
I think I'm equally good at the frontend and middle layer, the data layer I am passable, the backend processes - meaning receiving data/pulling data from other sources for insertion in my data repositories, processing data, queuing data, optimizing processes for images, anonymizing data etc. I hack stuff together and it looks pretty ugly to me (unless processing XML where I am very good), but I can get it done. It's not a different mindset that makes me less competent in those areas, in my opinion, just inexperience.
on edit: and of course one will always be less than perfectly competent in every part of the stack, because the stacks cover a lot of ground. I think I'm pretty good at CSS, but really am weak in use of some parts, what I'm better at in CSS than most developers is understanding the cascade rules and when things will conflict.
These days I'm a devops-engineer, whatever that means, and I think my background of low-level understanding/coding has been very helpful.
Developers these days who can do amazing front-end things tend not to understand how computers work, how servers work, and how to debug problems under pressure. I'm sure they're entirely capable of doing the obvious/basic things, but their experience doesn't often qualify themselves to work from the bare metal upwards.
I don't feel defeated or obsolete, just the nature of an ever evolving curriculum I guess.
It's good enough to debug performance and compilation problems.
But I think there are far more front-end developers who know (and are amazing at) CSS, Javascript, react, and all that stuff - and have no ability to diagnose, or resolve server-side problems (be they overheating CPUs, bad RAM, flaky DNS, or other problems).
In my last job, I entered as a frontend developer and moved into more backend work in addition to frontend work. There was strong engineering vigour, rigorous code reviews and careful coding standards to ensure consistency. I'd like to think I was competent across the field and at least equal to my peers but that's not for me to judge. My peers and those to whom I reported were very pleased. This suggests externally-verified competency.
I find it better to enter as either a frontend developer or backend developer and then demonstrate internally competency at both rather than trying to sell yourself as full stack from the outset.
It helps to have been developing web-related software for the past 25 years. Over time you learn new things because they fascinate and interest you.
Recognisable competency throughout the stack is achievable by anyone with enough curiosity to explore combined with enough experience to know how little you actually know.
I hear you that there are plenty of "full stack devs" whose competency is mostly in one area.
But (at risk of sounding cocky,) I would consider myself competent on both the front and back end. And I'd say I'm not alone.
"Absence of evidence isn't evidence of absence." You just haven't been around these people. Frankly, I think this is more a statement about the industry as a whole than "full stack". There are a lot of gainfully employed but mediocre developers.
I think having both skill sets affords me the perspective to see whenever e.g. the front end is doing things the back end should be doing.
Sometimes specializing in one area means "you have a hammer, so everything looks like a nail." I've seen _way_ overcomplicated front-ends that would be a much lower long-term maintenance burden if the developer wasn't looking through "everything should be solved with client side JavaScript" tinted glasses. ;-)
Similarly, some know about every Linux error code, and how to tune systems around applications, which is a bit of a lost art.
So sure, fullstack exists in a way, but I still find it too broad a concept for any human to master on both ends.
Like almost anything, it's just a matter of time and experience. Plenty of people in the industry have been around since the Web was young, and have watched the technologies evolve over the years. We've built UIs rendering on the back end and we've built UIs rendering on the front end. We've built back ends that talk to databases and we've built front ends that talk to an API that looks like a lot like a thin wrapper around a database. So many of the skills and so much of the domain knowledge in web development is useful, or at least potentially useful, on both sides of the HTTP divide that it's hard to see the front and back end as significantly different from this perspective.
Once you've got your fundamentals sorted out, the important things don't change very fast in this business. Much of the "rapid development" is just hype and reinventing the wheel, and every time a new generation of young and enthusiastic developers thinks they've discovered a radical, game-changing idea, which in time they will discover the old fogeys had been using since the last millennium. Again like anything else, with enough experience you can easily see through most of that, but also learn to pay more attention to things that might actually matter. This is true in front-end development, back-end development, usability and accessibility issues, databases, visual design...
To put this in concrete terms, if we say (just to choose a number) that someone reasonably conscientious with 3-5 years of professional experience behind them could be proficient with the technical details of current front-end or back-end development, is it really so implausible that someone with 7 years of professional experience behind them could not have developed and maintained similar proficiency with both?
Yes. The world doesn't stop spinning so you can learn both. In the time you're focused on one, the other changes. Computer science fundamentals are going to be consistent, but the problem domains of front-end vs. back-end are vast. You can have skills from either, but ultimately either one is complex and wide enough that an individual focused on just one won't master it but merely be more than competent.
Also, just keeping track of the tech either side is discarding is enough to fill one mind. Keeping a pulse on useful best practices from multiple domains while the world races forward is no small feat.
That is true, but the world seems to spin a lot slower from the right perspective. Most of the "progress" in web development really isn't. Game-changers come along every now and then, but much more rarely than hype. Someone who is already proficient with both front-end and back-end work can easily keep on top of the developments that actually matter.
Also, just keeping track of the tech either side is discarding is enough to fill one mind. Keeping a pulse on useful best practices from multiple domains while the world races forward is no small feat.
Yes, professional development takes work, and keeping up with technology requires some of your time. But once again, the more you already know, the less any given development is likely to make a profound difference to you, and the more quickly you can scan what's happening and focus in on anything of real interest.
For example, on the front-end side, I probably find one or two articles or videos per month that offer some genuinely new insight or understanding. I might find one or even two front-end tools per year that are sufficiently interesting to be worth investigating in more detail and potentially adopting for future work. It's not that I don't read or watch more than that, but I filter ruthlessly and rarely waste time on anything that doesn't have either an immediate benefit or obvious potential. This also means I usually haven't wasted much time on tech that didn't stick around for long.
Statistically speaking, I'm probably a more experienced developer than most here, but I make no claim to being unique or superhuman. I imagine there are others reading this discussion whose experience is not so very far from mine.
Aside from being a software engineer. I also have various hobbies that I cultivate with above average level, graduated from 3 degrees in unrelated field, and know three languages.
And I know there are plenty of people who do more than me.
It isn't a stretch by any means. I believe plenty of people are very capable than what they think they can do. Human capabilities are more able than you think. Little by little knowledge compounds. i.e. if you can play guitar well most likely you can pickup bass quickly.
As you said, most full stack devs tend to have an area they're strongest in, and know enough to be able to hack things together for the rest. As a team, there should be someone with skills in each field that can be utilised to tackle harder problems and for guidance, while simpler tasks can be completed by any team member. You don't need 5 years of experience as a JS dev to add a loading spinner to the UI or 5 years as a Rails developer to add a CRUD endpoint.
I like to describe it as being analogous to an infantry squad, you have the machine-gunner, the grenadier, and the designated marksman, but everyone on the team is capable on some level of using a machine gun, a grenade launcher, or a sniper rifle.
The important part is to ensure that there are people with enough experience in each area to be able to provide technical leadership and mentoring. If you have a bunch of backend devs trying to hack away at JS and reviewing each others code, with no concept of best practice, you're going to get an amateur end result.
The challenge here is that, at least in the front-end (I'm a front-end engineer), it's not so much the case that there are certain problems that are hard and you need help with, but that there are things you should know you're doing wrong, or at least suboptimal.
For example, you can add a loading spinner, but you need to do some extra work to make sure people relying on screen readers, for example, know what is going on. After you've implemented a loading spinner, there is nothing that is really pointing out to you that you forgot that.
Though I guess the same holds true for the back-end: if I write a really inefficient database query, everything still appears to me as if it worked just fine. Only when it blows up later will it become clear that I lacked knowledge there - and let's hope that I did have enough knowledge to properly instrument the logs.
Of course, this isn't necessarily problematic. When you're a small team, getting something out the door that can load data even though the UX for some people sucks is better than not being able to do anything at all. But if you can afford specialists (at least in the sense that e.g. the front-end will typically only be touched by those who are strong on the front-end), you can get higher-quality products.
If I don't know how to do something, I go and learn what's the best way to do it (by reading documentation, books, or just be asking more experienced devs). That's all.
If a company I want to work for is looking for "JavaScript" devs only (or "Python" devs only), that's a red flag... But if I really want to work for them, I would just apply because if you are a decent software engineer/developer then it does not matter if the job involves JS or Python or PHP. You can learn without too much trouble.
Personally, I work as the architect/leadership level, but I'm still pretty handy at DevOps, SRE, RE, Back end, and have even delivered a few front-end projects in my time (mid 30s).
I'm not claiming to be the best, but I'm good enough that I mentor engineers that are senior and costing >$250,000, and I did not gain these skills simply from being a generalist.
What I simply cannot do is keep up with 10s of engineers changing a code base when I spend a lot of the day in meetings. My choice is to be the bottleneck the project and cause discontent, or let the team roll with it and pick up the pieces that fall through the cracks.
Does this means that I could never again be an IC which specialises in any part at a reasonable enough level? I doubt it. But pragmatically, there are few people who see the bigger picture who have enough technical chops to get disparate specialists working together, so rather than be the 10x engineer, I try to focus on amplification and making my team a 10x team.
The funny thing is that 10x engineer drains mindshare from the teams, rest of the org, and will lack diversification, like architecture, testing and Ops.
Now I work on a complex React app in TypeScript with a GraphQL backend in TypeScript. I can build a feature end-to-end. From domain modeling to an API to UI with animations. Optimising SQL queries.
There are people like this. Software engineers who have experience across the stack.
I don't do devops but I've met someone who can do full stack app development and devops pretty well too.
It's mostly due to the sheer amount of things you have to keep in mind at any given time. Not the core things like algorithms and such, but (Javascript + Typescript + React + Redux + GraphQL + Apollo + .... ) + (Java + Spring Boot + MySQL + BigQuery + PubSub + Datastore + ...). All the different libs, and the ways to communicate, and idiosyncrasies specific to different languages and different libs.
There's never time to get good at something, as you're pulled apart :)
At the end of the day what we do is to solve problem.
Even if you specialized in let say just front end, that itself can be broad enough to master.
I think you just haven't seen them yet.
Perhaps your views are more a reflection on people getting pigeonholed at large companies, or otherwise choosing to specialise? Or something like that?
I personally think it's hard to be a _really_ good frontend dev without a chunk of more general development experience. What wider experience will you draw from to solve hard frontend problems otherwise? If your Angular/React app isn't performant enough because of the computations it needs to do or allocations it needs to make, how big is your mental toolbox to fix that if you haven't done more general backend dev work? It's all just software, ultimately.
Hah! Much appreciated for the clever use of "endian" in this context.
To say that it's an anti-pattern I have to disagree. You could just as easily say that Combining front and back end is an anti-pattern.
To be honest, as a front end dev, I find it frustrating when trend setters keep trying to squash my role into a broader field. Stop doing that!
I generally disagree that having some separation between client and service is undesirable. Everyone needs to be a generalist to some degree, but frontend specialists are important (speaking as a frontend specialist). There's just so much people need to know in order to be really productive and not make a mess with JavaScript, frontend frameworks, and DOM APIs that I'm skeptical that they'd be able to balance that with having a deep understanding and breadth of knowledge of backend systems.
I think this is backwards. We have a conceptual split because people self selected for front-end or back-end biased roles, nothing has ever stopped anyone from bridging the gap if they wished. I'm a front end dev predominantly and there's nothing stopping me from pursueing "full-stack" if I wished except I feel much more naturally suited to solving the kinds of problems the front-end expresses.
The scope for each respective stack is so vast these days that it's no wonder people prefer to specialise just to have some focus.
If one or two people can build a feature all the way through, getting help and advice from the experts in each area as necessary, then you can save a lot of time and are more likely to end up with a coherent design.
Also, how can you know what a good backend design looks like if you have no experience of consuming it on the front end?
I think if you're a web developer you should really build a web site all the way through at least once, even if you later forget the details about a lot of those stages.
I guess my point is: to each his or her own. Everyone finds different engineering tasks interesting.
I'm sure there are some primary physicians that could pull it off and wear all the hats. That's fine. The point is there are multiple hats. It doesn't all fit in one hat anymore.
It's not a security thing, it's a plain and simple, I only want one thing to launch, that I can use for anything.
The only apps I install that aren't a web browser are ... an ssh client, because then I can ssh to .. my VPS, work, whatever, and look at things, or IRC, or, again, it's the whole single app multiple uses thing, and the damned "smart" watch app, because it needs something on the phone to manage it :\
And then there's me on the other end of the spectrum.
I don't want a second OS. I would rather run my apps locally, where I have an easier time monitoring/controlling them, then from someone else's machine.
edit: on -> from
There is an emerging trend towards "full stack frontend", where we have someone who can design UX, and also wire together backing services like flux, webpack, and APIs.
As a DevOps guy, you can definitely spend a serious effort to pipelining your fronted testing, deployment, and monitoring. Setting up development environments, Sentry, optimizing webpack builds, securing CDN distributions, incorporating Analytics, etc.. these are "Frontend DevOps" kinds of tasks. Hence, vertical integration is important. The frontend can be developed as an independent service in of itself.
On the server-side, there is still a UX. We have API design, documentation, and discoverablility as the "UX" of a "backend", now more appropriately described as a "backing API", but a complete service in itself.
So i think this article is ignoring the emergence of JAM-stack and Edge compute. I think it forgoes the robustness, and ability to quickly deliver business value that these new platform paradigms can enable.
- browser compatibility
- usability issues, affordance, animations, transitions
- build and delivery, performance
- CORS, CSRF, all the client side security aspects
These are all very specific domains on the client side and it’s simply not possible for someone to keep up while at the same time doing k8s + Kafka + datalog + Hadoop + java + whatever else.
To me this clearly spells a situation where UI/UX takes a backseat.
That doesn't mean there isn't an opportunity to divide up tasks, build assembly lines, and lower the job difficulty so it is accessible to more people.
But then, I program a lot by my self, and still use Singletons when it's the simplest way to get something done.
As someone who is fairly well a generalist polyglot programmer there is a definite truth that I will never be as good as someone who specializes. Am I capable of doing layout and custom stuff with CSS, yes. Am I great at it, no.
In a development team, I'm going to do the things that bring the most value. That's going to mean doing things like GraphQL services and DevOps before I do the "front end", design based work.
But then I'm also a heretic when it comes to software engineering. I'm far more interested in getting a product out into the market and starting to learn than I am making something gold plated with the newest hottest tech and spending 18 months building a super resilient platform that does not have product market fit (and will never have product market fit).
Testability and maintainability should be core competencies of any engineering or technology role, whether it's front end development, back end development, building IoT devices, or designing airplanes.
It has never been a good idea to artificially separate front-end and back-end, or front-end design and front-end development, or back-end architecture and database design, or just about any other two labels you care to assign. These things have always been related, and a successful system combined all of its elements effectively. But that doesn't just happen by magic, the people involved have to actually think about it and communicate, instead of dogmatically adhering to some fake silo arrangement that rarely helps anyone anyway.
It has never been a good idea to artificially pigeonhole any given member of your team either. Sure, everyone has to start somewhere, so maybe you start as JS guy or DB guy or whatever, but that's for newbies. After even a few years working in this business, no-one who's been paying attention truly has a skill set that is only one narrow field but a bit deeper. Everyone is multi-skilled to some degree, and often with experience people develop deep skills in more than one relevant area.
Roles like "full stack developer" or "UI designer/front-end developer" are just somewhat arbitrary labels for people who have a particular combination of skills. People who say that you can't play these parts effectively, or that no-one can possibly keep up with all of that so everything should be specialised, are in my experience almost always trying to belittle someone who has broader and/or deeper knowledge and skills than them, and that's not a very nice thing to do. It's not a very smart one either, from a business perspective.
I believe much of the time we would be better off if we just dropped almost all of these specific-yet-somehow-vague titles, at least beyond entry-level positions. You need someone (for a small project) or a team (for anything larger) with enough of each relevant skill available to get the job done, and you need everyone involved to know at least enough about what else is happening to communicate effectively with their colleagues. How you divide things up beyond that is almost invariably, again IME, best done based on the individual people you have available and their personal strengths. As long as you ignore the other common but similarly absurd premise that people working in a huge and highly skilled industry are or should be interchangeable, you can work this way just fine, and then the kinds of self-inflicted damage the article is worrying about simply doesn't happen.
But these product teams are unrelated to our reporting structure in the company. Products come and go. Teams to build them or improve them have to be spun up and spun down. It doesn’t make sense to tie this too much to the organization’s more static managerial structure. To be sure, some products are so central and core that their delivery teams are essentially permanent, but that’s far from always the case.
In this more static reporting structure, we have a much stronger split based on functional specialty. Backend engineers tend to report up into chains of mostly managers and senior managers who are experts on backend development. The same is true of frontend engineers. This allows people to delve deep into their specialty, and it allows engineering managers to drive change and progress across all backend or frontend engineers at the company. For instance, this makes it a lot easier to make sure that backend work on multiple product teams is going to coordinate well.
We’ve found this works quite well in practice. In your day to day experience you’re on a product team with frequent exposure to many domains. But you report into an organization based on your functional specialty and area of expertise.
Renderers should consume this "view" and render to their platform (browser, android, desktop, etc) and just proxy back UI events.
#1 Such system will mandate a data mutation contract to be defined. Both "back-end" as well as "view" related code will use the same contracts to change application data.
#2 Such a tech will be batteries included, where one language/framework will take care of business logic both in front-end as well as back-end.
#3 There won't be ten different layers to touch, when a change happens.
#4 Development teams will be all full-stack, i.e no distinction between front-end & back-end teams. It's all just business logic at the core. Will facilitate more work with smaller teams.
Of course I haven't thought through this fully, for example what are animations in such a system? But it sure is interesting to think about.
The result would be better (full-stack), but there's no time to deliver features quickly by market standards.
It was a pretty good system, I honestly miss it a lot.
First hand experience passed down by my own teachers and clearly many others is that that having your business logic mixed in with your UI CODE is a bad idea. A lot of people take that lesson and fuck that message up and here we are.
How many times do we write an angular app (using mvc separation). And then connect to an mvc web server framework. And then have a separate backend layer with a database behind that.
There is usually many more layers of mvc and separation added in once you look at your class hierarchies and subsystem architectures.
Separating is very useful to a point and after that point you are just creating needless overhead.
Unfortunately the only sure way to identify that point is by screwing up and rewriting everything
As a consumer, I have more faith in the behaviour of a browser than I do of a random app, or at least more confidence in the many eyes that will alert me to problems by browser could pose, and from that more faith in my ability to constrain the behaviour of a browser. So I would rather use a website than install a native app. As a developer, I don't trust that any request that comes to my API is an appropriate, well structured request that came from my front end code. This is why I separate back from front. My front end is my emissary to a potentially hostile land.
Why?
- Power consumption is much, much lower in a native mobile app
- SwiftUI is easier than React and CSS. I've used both, and I can't think of a drawback. (Friends tell me good things about Flutter, though I have not used it.)
- Web-like linking is just going to keep growing in apps
- App store guarantees that my parents won't get hacked via their iPad, but I can't say the same about their old computers that run Chrome!
That completely misses the point. With mobile applications you are only a dark pattern away from clicking on a button and letting a third-party spy on all your contacts, location, personal info, etc.
You don't get that with the web.
Also, you will get all of that with the web. Just check google chrome to see what kind of permissions can be granted for any individual website. Contact sharing is right around the corner.
I read a while ago that Steve Jobs never wanted the idea of an App Store on iOS, as he believed webapps and web based services would evolve naturally without any added infrastructure, whereas an App Store would require extreme development effort and infrastructure from Apple.
Obviously he was wrong, and the App Store exploded once it was added.
However, I believe long term his idea is correct, it was just wrong timing. Webapps have only gotten more and more powerful as time has gone on, and they do not require any explicit download from the user and can be updated automatically by the developer. More and more access to the devices physical resources is slowly being added as the years go on, and it’s only a matter of time until more and more are added.
I will admit for scenarios like games or resource intensive computing where access to bare metal is necessary, I’m not sure webapps will be able to fill that void. But for most everything else I see the web as a the future, while mobile apps are the temporary means to an end while browser APIs and capabilities catch up
The two benefits
- webapps don't need to be explicitly downloaded
- webapps don't need to be explicitly updated
Sound good but downloading and updating was never a problem in the eyes of the general consumer. On the other hand
- native apps are faster
And that's a compelling benefit for that even non technical people will prefer native apps for.
The other killer „feature“ of webapps is that you can have a single one for multiple platforms.
That's a feature for developers, not consumers. Consumers will be unhappy if you tell them your mobile app doesn't exist on the app store and must be downloaded from some third party website.
I don't know whether Jobs really wanted the iPhone to be open all along and was just playing dumb with his "sweet solution" of anemic web apps. Some of what I've heard from others supports the idea that he really did think web apps would work, but it also seems to be common knowledge that they were working on what became the iPad before the iPhone, and it seems pretty unlikely that they were planning to shop that without support for third-party applications -- although, of course, they might not have been thinking of an app store.
Websites can have ad blockers too which I’d argue make the web versions way more efficient.
And I’m not convinced about the “hacked” argument. How can anyone be hacked via any web browser on an iPhone? At least on Android they could download an APK without knowing what they’re doing but default security will stop them installing it. Meanwhile we’ve recently discovered that a ton of native apps constantly read the user’s clipboard, something web sites aren’t able to do. So it’s nuanced at best.
But IMO the biggest argument for the web is simply that you don’t have to install it. If I’m shopping I want to browse through a few different sites, I’m not going to download and install an app just to look at one product listing.
For web it's different but you see more and more webapps following the Android's Material Design which for me feels awkward on Windows or macOS.
It’s still possible to keep things simple, serve data from the server to the front end, and keep the front end purely visual.
Unfortunately this isn’t the case anymore; I think the current trend is making things harder to maintain overall and lowers the user experience.
Im profesional programming, the front end often matters more than the backend in that it is the part stakeholders see and understand. It’s not for technical reasons.
I think the reason people who feel are too good for front end work or that the UX doesnt matter is because they have a poor sense of aesthetics and business, they are ideologues who probably dress poorly. For example, the person hating on front end work in the article is a conference speaker, I haven’t met anyone with a real job in the industry who thinks JS is a toy language since the early 2010s, before SPAs were a thing, and even then it wasn’t hating on the front-end, it was hating on the quality of the JS ecosystem itself. If you really think the front-end doesnt matter then why should you care what your code looks like? Feel free to write it as messy as you want, doesn’t matter as long as it works, right? Stop refactoring, stop giving your variables meaningful names, stop using classes, and so on. These are all presentational.
By the way, I actually think that technically dividing the front-end from the backend, as in having them live in different repos and so on, is actually a best practice.
I started my professional development career 20 years ago, and there were pretty much 2 types of developer: those that did embedded development, and everyone else.
JavaScript was even more of a shit-show than it is now (except that npm didn't exist), and browser support for, well anything, was terrible and inconsistent. Almost exclusively, server-side rendering was used (e.g. PHP, CGI, dotnet when it arrived a short time later). JavaScript was used sparingly to add interactively when needed.
It was only really when npm and specialised front-end frameworks started to arrive that a distinction started to form. At the same time, browser compatibility started to improve, and JavaScript, HTML and CSS finally started to evolve and improve. With those additional capabilities came more complexity, and so front-end has gradually became a more specialised field.
> An anti-pattern is a common response to a recurring problem that is usually ineffective and risks being highly counterproductive.
Author has done no work to define the problem area, or why BE/FE is a solution to that problem area, and why BE/FE is counterproductive/ineffective.
The answer for me has become a very fervent belief that we should be doing all of the rendering server-side. For most business applications, you can deliver a very high quality experience to all platforms with a single, well-built PWA.
Pushing ever more demand onto the client devices and cloud services is producing brittle, unethical applications. If I am running a business, I want to impose as little on my customers as I can. I am tired of apps and websites that are so bloated that my CPU fans have to spin up in order to compile 20 megabytes of someone else's shitty codepile, just so that we can determine what initial UI I should be experiencing. And then, once it finally does load, it runs like total garbage because every scroll event is blocking on some monstrous javascript shadow dom state machine contraption.
If you fully embrace the server-side model and start to use something like Blazor, you can find productivity gains that are unimaginable in a typical api-in-the-middle UI approach. Being able to directly inject your business services into your UI and use the same models as everything else is extremely powerful. Writing scoped state services for each domain of UI, and then being able to compose them with each other allows you to build a well-organized hierarchy of state management that tracks a specific user's interactions across the entire application. Hooking up a user's state management instance into CLR events works just as well as you'd hope it would. Building extremely complex business UIs is almost too easy once you figure out the pattern. Also, because everything happens over websocket it "just works" and you don't even have to think about wire-level contracts/protocols/etc. More brain energy can be spent on cool features that build upon these powerful abstractions.
Scalability is always a concern when you are server-bound on rendering client views, but servers are extremely fast now and I'd argue you should at least make it work for 10 clients before you worry about 10,000,000. Iterate on the points that actually fall over from real world testing. This will probably be much more expedient than poking around in the jungle on hyper-scale architectures from day 1.
Dividing by technology is often a bad idea.
Divide by purpose and then group tech that suites that purpose.
Ultimately either can do analysis of data, though tradeoffs generally push that to one side of the API or the other.
Take Auth0, for example they give you a full stack solution for the purpose "authentication".
But, yeah, the more low-level your purpose, the more technology specific a solution you will be.
In those environments front end work can actually be the more complicated system, where a developer is trying to take a complicated manual workflow and capture it into a flow of screens that make logical sense for the user.
What the author is seeing is a lack of team alignment not the division of labor, give that he is a full-stack developer I am sure he is keen to the division, but the problem is a people problem in nature. In the environments I have worked, we do not divide teams into front-end or back-end. Teams are comprised of a mix of skills that are aligned to supporting a business silo. In these team dynamics developers know the value of each of the roles, from the DB admin, to the back-end guy to the front-end guy and what we usually see is cross pollination where many of the *-end developers end up picking up skills from the other side and start working the full-stack.
[...]
To be clear, I’m not saying that we all need to be experts in everything. That would be impossible. Today’s technology stack goes down a long way, so being a genuinely balanced full-stack dev is probably not the most realistic of goals — but staying open-minded is."