It's kinda up to you to decide, and what you decide will help dictate how your career evolves. It may be the case that your employer has some idea(s) in mind, in which case you should probably just ask - at least if you intend to stay there a long time. OTOH, if you accept that you'll likely move around throughout your career, and treat the whole thing as kinda fuzzy/probabilistic, then you have a lot of freedom to choose your core competencies... but recognize that you may evolve to the point where changing jobs (possibly even having to relocate geographically) may be necessary to keep on the path you choose.<p>All of that said, I can think of a few possible things to consider developing as core competencies:<p>1. Deep, deep knowledge of a specific language (Java, Go, Python, Rust, C++, COBOL, Agda, whatever)<p>1a. Deep knowledge of a lot of the associated tooling / ecosystem <i>around</i> your chosen language. For example, if you decided to become, say, a Java specialist, then the natural extension to that would be diving deep into an IDE like Eclipse or IntelliJ, a build tool like Maven or Gradle, popular libraries and tooling like JMS using ActiveMQ or HornetQ, the Servlet API stuff (if you want to build web apps), testing tools like JUnit, TestNG, EasyMock, etc., etc. If you chose Go as your language there would be a similar, but slightly different, list of "associated stuff" to consider. Note that Go or Rust might have a smaller "ecosystem" than, say, Java or Python, simply due to being younger. Further note that if you chose something a bit more esoteric (by modern standards) like, say, COBOL, then environment around that would likely be markedly different from that around more mainstream platforms like Java, Python, Javascript, etc.<p>2. Big Data -- you could choose to dive deep into Hadoop, Spark, Flink, Storm, and all of the trappings of the "Big Data" world.<p>3. HPC -- you could focus on C++, FORTRAN, etc., using MPI, OpenMP and the like, building Beowulf clusters, focusing on scientific computing, etc.<p>4. Machine Learning / AI<p>5. Embedded Systems -- firmware, device drivers, other low level programming. Maybe doing assembly language, or C/C++<p>6. Front end development - learn all about Javascript, HTML, CSS, React, Vue, etc.<p>7. Cloud -- learn all things cloud development --> all about one (or more) of AWS, GCE, Azure, Alicloud, etc.<p>Of course you could also look at all of those domains and try to pick out "what is common across all of these areas", and you'd probably wind up with something like "problem solving" as others have noted. And that <i>is</i> kinda core to everything. But it's arguably also just the price of entry, and something that should just be assumed for a competent software engineer.<p>Note to that there is always <i>some</i> overlap. Even if you are a "front end developer" there could well be times when you need to know some SQL or something. So you want depth and breadth of knowledge at the same time. Hence the idea of the "t-shaped"[1][2][3] person. Of course you can have more than one vertical bar, so you could be sorta "n shaped" or "m shaped" as well. Anyway, it's just a metaphor so don't get too caught up in it.<p>[1]: <a href="https://en.wikipedia.org/wiki/T-shaped_skills" rel="nofollow">https://en.wikipedia.org/wiki/T-shaped_skills</a><p>[2]: <a href="http://coevolving.com/blogs/index.php/archive/t-shaped-professionals-t-shaped-skills-hybrid-managers/" rel="nofollow">http://coevolving.com/blogs/index.php/archive/t-shaped-profe...</a><p>[3]: <a href="https://stemfoundation.org.uk/asset/resource/%7B3EA5228A-B620-4783-AE91-190F2C182DAA%7D/resource.pdf" rel="nofollow">https://stemfoundation.org.uk/asset/resource/%7B3EA5228A-B62...</a>