I have about three years of professional experience but no computer science degree, and I want to grow into building more complex software. People often say the best way to learn is by making things, but I'm not sure how well that applies to data structures and algorithms or system design.
I understand that building projects can teach these topics, but I worry I won't encounter enough of the important concepts naturally. At the same time, I'm considering studying them first so I can become a better programmer, design stronger projects, and qualify for better roles. I'm also concerned that studying could become a way to avoid starting a difficult project because I'm afraid of getting stuck or burning out.
Would it be better to learn the fundamentals of DSA and system design first, or should I start building and study those subjects as specific needs arise?
3 Answers
Projects and DSA aren’t really competing subjects. Data structures and algorithms are tools used inside projects, so building something can be a great way to understand why a hash map, tree, queue, or graph is useful. A small amount of structured study can give you a map of the territory, then projects help turn that knowledge into practical understanding.
Learn enough fundamentals to avoid being lost, then build immediately. For DSA, that might mean understanding common structures, complexity, and a handful of core algorithms rather than memorizing dozens of interview patterns. For system design, begin with a modest application and periodically ask how it would change if usage, data volume, or reliability requirements increased. That combination keeps studying practical and prevents it from becoming procrastination.
Don’t treat everything as one giant prerequisite. Start a project and learn the concepts that become relevant while you work. If you’re preparing for interviews, study DSA separately as a focused career task, but you don’t need months of problem grinding before writing useful software. System design is especially valuable when a real project gives you constraints to think about—traffic, storage, reliability, caching, and so on.

That’s my concern: if I only build familiar apps, I might never realize which data structures exist or understand the tradeoffs between them. I’m leaning toward learning the basic concepts separately, then deliberately applying them in projects instead of waiting for them to appear by accident.