An important skill in software and UX design is being able to build hinges between user needs, data formats, programming languages, and external APIs.
As an engineer, you practice mapping real world concepts like user needs, logic, and data to programming languages and datastores that computers understand. It is important for you to be able to hold multiple concepts in your working memory at once and map across them. This is something you will often be doing when connecting different functions, services, and APIs between each other.
Understanding existing software and libraries is key to writing your own code. The better you are able to recognize common programming abstractions, the better you will build your own like them, and this comes only with experience. Look at lots of repositories, even just glancing at the documentation or UI design. Pattern recognition is like a muscle, you start to see the full shape of a problem through repetition, and eventually you will have a deep understanding of how different systems work. Paying attention to which design patterns you are drawn towards and which seem the most intuitive to you will help you figure out what sort of code you like to write.
Always consider the practical needs and the related programming concepts from first principles. Very commonly, you can reason any problem out into data (such as rows in a database, or individual files), application logic, and some sort of view or controller that allows a user to access or perform actions on the data. Consider how common websites work, even at a surface level, and you are well on your way to building your own apps and websites. Going deeper, you will discover different things work best for different problems. Some databases are in-memory which provide lower latency, some programming languages are better for asynchronous code, some make data access guarantees. Attention to detail, and knowing when to look for not-yet-known unknowns like security and performance best practices, are key as an engineer.
When building something new or rearchitecting existing code, you get an intuition for how data flows between functions, what order to do things in, and how much something needs to be changed to add new functionality.
It may often feel like you are being overloaded with new concepts, and confused about why there are so many different options in terms of programming languages, services, architectures, and APIs. There are a lot, and this is because each one attempts to include a selection of key features and enhancements that the project’s maintainers believe best define the project and best set it apart from existing solutions. Just practice using a wider and wider lens each time you sit down at the problem, and you will see connections in how software is designed. You’ll even start to see engineering principles show up in how other things are designed, like buildings, clothes, furniture, and tools; each thing to suit a need.