A metaphor I sometimes use is the difference between an architect and a construction foreman, working to build a building.
A foreman can build a building herself–she’s built buildings before, she knows generally what goes where, and she knows how to actually put screws and nails and wood and plaster together to form a structure.
However, the foreman has not studied how buildings ought to be created. An experienced foreman will rely on things like municipal building codes (“design patterns”) to guide construction, but the end result may end up hard to use or unattractive. You often see this in discount repair jobs–for example, a bathroom where the door collides with the sink, or a cheaply subdivided house where there are rooms that feel awkward and hard to use. These were solutions that were easy to build, and they may be built very well, but somehow they don’t hang together.
Conversely, an architect is trained in understanding spaces, how people will use the building, how they will move through it, how lighting and ceiling height and door placement and room organization all work together to make a pleasant place to live. They may not have the ability to plaster a wall or drive a nail, however, and as a result their more adventurous designs may be challenging to bring to the real world.
As a front-end developer, you’re the foreman and construction crew all rolled into one, but you might not be an architect (yet). You may not have the training about how to design the software for the best User Experience. You can draw on examples from the world around you to produce functional apps, but it may not be sufficient to produce usable apps.
The good news is that you can learn UX techniques that will help you to understand user needs, to create designs that meet those needs, and to test those designs with real live users to verify.