One of my favorite quotes in computer science lore is as follows:
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton
There is only one hard thing in Software Engineering
The most resilient problem in software engineering is keeping the promise your software made at its inception. In fact I believe it is a big reason why developers gravitate towards frameworks and platforms that are trending, and also why it is so easy for new frameworks to trend in the first place. Green field development has no historical burden, and requires no compromise or empathy.
As a computer scientists we can architect a clean, sterile environment and develop patterns couched within those idealized settings. However, as engineers we are forced to deal with the natural world as we find it, with all its hazards and imperfections.
We take those first principles that we laboriously memorized and mastered in computer science, and we willingly wade knee deep into the real world and shout defiantly "This can work here!". Like city Engineers and planners have done for years, we accept that we cannot simply start over, or move the city else where. We confront the resistance to change, in all its forms, and attempt to articulate a better approach for all those who will come after us.
We literally build upon the shoulders of giants who may have never imagined the future we currently face.
A truncated technical imagination tends to yield limited design options and we should remind our designers and technical architects that chickens do, eventually, come home to roost.