DEV Community

Hannah Masila
Hannah Masila

Posted on

When do you become a Jack of all trades but a master of none?

I have been learning and learning new languages every now and then. Yes, I have the basic knowledge of all these languages. My question is, am I slowly becoming a Jack of all trades but a master of none?

Latest comments (33)

Collapse
 
thomaswdmelville profile image
Thomas Melville

I quite like the "Paint drip" analogy from Kent Beck: facebook.com/notes/kent-beck/paint...

Collapse
 
ben profile image
Ben Halpern

Love the responses in this old thread.

Collapse
 
elpibeperez profile image
Eduardo • Edited

I think that there are two diferent things here. If all you do when you code is learn how to create a hello world in
each language, then you are screwed. But if you as a developer put some effort in becoming a better programmer, and think in coding clearer and better, then those concepts Will follow you no matter what paradygm or language you use. I am a tech lead un nodejs and I can't remember if the length of a string is a method or a property. Stackoverflow is there for solving formal stuff. But when I make a code review, I analyze if things are named correctly. If the architectonic patterns are followed. If refactoring is needed and sutch. You must distinwish wich things of a language are just formal concepts and which concepts will make your code more readable and mantainable. After all, the most important role as a developer is create a piece of software that can be understood, replaced or modified by anyonoe. Because requirentes will change and programmers will change. Those are the only certenties

Collapse
 
gregorgonzalez profile image
Gregor Gonzalez

Everything is relative. I believe that starting on a new language It's the most difficult part. It's really great if you already achieved that part and with the basics you can continue to any path.

Complex programs requiere a base knowledge and complex algorithms are made of multiple basic algorithm.

I like to learn new things, I'm stuck on PHP because my work. Here sometimes you find experts that doenst know how to make a simple html form and others newbies that can do almost anything with a good guide.

Keep it simple.

Collapse
 
antonfrattaroli profile image
Anton Frattaroli

I thought of this question when I came across this concept: en.wikipedia.org/wiki/Lazy_learning

If you applied it to humans, I'd think the moment you become a "jack of all trades" is when you've consistently lazy-learned to the point when you've experienced enough instances where you've learned just enough to solve the problem that the knowledge begins to overlap to form a sort of generalization.

Collapse
 
feoh profile image
Christopher Patti

It's great that you're asking yourself that question. From where I sit the answer is easy: Are you attaining mastery in any of them?

Or to be more specific, have you reached the point in any of them where coding in them becomes almost like second nature? Where the syntax just flows from your keyboard?

If not, consider doing what I did and putting a moratorium on learning new languages for a while. Doesn't have to be forever, I took a couple of years off and really dove into learning Python. Best career choice I ever made for myself.

Collapse
 
nitya profile image
Nitya Narasimhan, Ph.D

I chanced to read this thread and it resonated deeply. This has been an issue that has dogged my entire technical life (well over a decade) in the software industry.

When I first started in the space, I definitely felt that depth was better than breadth. Better to be really really good at one thing than to know a lot of things. So I got a PhD (in distributed systems & reliability engineering) and my first job in that domain. I worked in it for all of 10 months - then got an opportunity to work on a new project in mobile. I knew nothing about anything in that space, but I was younger and more fearless I guess because I jumped in without worrying about it.

It changed my life and I never worked in the area of my PhD expertise again.

Instead I have since worked on multiple projects (large and small), in different domains, with different stacks, languages and devices. And had to pick up new ideas, tools and technologies along the way constantly. And my takeaway was this. It was not the topic of my PhD that helped me -- it was the capacity it gave me to look at a problem, explore it from different angles and try to innovate solutions by using a wide variety of tools from analogies to trial-and-error to multi-disciplinary collaborations.

So my answer to you is: It depends on YOU. On how you approach the whole idea of learning and applying what you learn. And what your GOAL is when you pick up a new language to learn.

Don't learn for the sake of learning. And don't simply chase after every cool language or technology. Definitely spend an hour reading and absorbing the details but after that ask yourself what your goal is. Then set aside the right amount of time and plan the effort out so that the task itself goes from "just something I did for fun" to "this is what I learnt from doing X and now I can apply it to doing Y later"

In my case, I try to do one of three things for every new language/technology I learn

  1. I spend just an hour or two, understand it, then think about where I would apply it. Then file that away in my head and move on. It comes in handy when having discussions with others or in seeing patterns in other contexts.

    1. I spend a few weeks on it. I build something concrete with it (side project or hack) and see if it lives up to my expectations. If it does, then I try to do a talk on it. (I am trying to start blogging regularly but I do love interactive discussion better). At this point my goal is to share knowledge and learn something new in the process. It also solidifies my basic understanding and gets me out of "beginner" mode.
    2. I spend a few months on it. I build something for a client, or I build layers to a side project. And I get a real sense for how it could fit into some bigger project or platform. I look to collaborate with others who might need that piece or might be able to fill other pieces that I need to make that project come to life. And at that time, it has become a new tool in my coding tool-belt that I can pull out and use for future needs.

Hope that helped :-)

Collapse
 
humzakhan profile image
Humza K.

Perfect! Thanks for sharing :)

Collapse
 
scheidig profile image
Albrecht Scheidig

If you have a deep understanding of a lower level language (like C) and a higher level one (like Java) plus maybe a functional language, then adding more languages should not make you a Jack of all trades.
Instead you get the pattern of a new language faster and you should have a gut feeling of what is going on when you use certain features of those languages.

I started (in that order) with C, Assembler, C++, Delphi, Java (functional language still missing). Knowing how to connect C functions with Assembler routines is not a thing I need for my day to day work, but it helped to understand the concept of by-reference and by-value parameters, stacks, scopes etc.
Knowing how to allocate and dispose memory by hand (and how to avoid leaks using certain patterns) helps me also in languages with a garbage collector to avoid leaking resources and to avoid wasting CPU time by producing a lot of short-term objects for instance.

Conclusion: The point is to have a deep understanding of maybe two languages. Otherwise you would be a master of none, and not even a Jack of all trades.

Collapse
 
hanmaslah profile image
Hannah Masila

pbs.twimg.com/media/DAkJJG9XoAAak3... This sums it all up according to me. I think they are two sides of the same coin. Each has its advantages and disadvantages.

Collapse
 
joshcheek profile image
Josh Cheek

Hi, Hannah! My opinion is that it is worth becoming a master of at least one (probably, ideally, two), and that these phases of learning lots of new things and learning a lot about a specific area should come in alternating waves.

It is worth mastering at least one because it will give you a very in-depth competence that you can rely on when you want to play with an idea. You can rely on your knowledge of that language to remove the language as a hurdle when you want to try building an HTTP server or a tool to get something done that you're interested in / find useful. One thing to keep in mind is that when you're learning something new, you're paying a lot to get past the learning hump. For example, I've found that really new things require somewhere between 5 and 25 failures (like real solid attempts and just thoroughly failing) before I can use them to accomplish a real goal.

It is worth alternating these phases because it will open your eyes to new possibilities. Consider the 80/20 "rule", which says 20% of your time is spent getting 80% of the value, and 80% of your time is spent getting the next 20% of the value. So if you only spend your time learning new things, you're constantly in that high-effort for low-payoff area. But if you only spend your time in an area you're already competent in, then you might have mastered the tool in your toolbox, but that tool is a hammer and is a very poor fit when you need a screw or a saw. So by alternating, you allow yourself to build a competence (that honestly translates generally), and also a breadth of familiarity.

Since you're asking about languages, I'll recommend you try to get the depth of familiarity in something to address the browser, the server, and something lower-level like a systems language. Paradigm-wise, I'll advocate you use one "object-oriented" language and one "functional" language. Sort of trying to pick a set of languages that is fairly small, but gives you an ability to address a lot of domains and experience a lot of ideas. I could talk a bit about what probably fits well here, but I don't know your goals and experience well enough.

I'll also point out that you can gain a massive amount of knowledge in a short time by implementing your own mediocre versions of tools you use. In this case, that means writing a language. Based on what you're saying, I'll recommend "The Elements of Computing Systems" aka "NAND to Tetris", which will have you write something like 5 languages, each building atop the one before it. The only one that is really difficult to build was the very last one (because that language was sophisticated enough to require nontrivial parsing).

Collapse
 
joshcheek profile image
Josh Cheek • Edited

Oh, just looked at your profile and I see it says "A die hard software developer. I do Ruby, Javascript, DevOps and currently learning Golang" That seems like a really good set of core languages to me. JavaScript gives you access to a ton of domains, it's the most popular language right now, and will only continue to grow. Ruby is a wonderful language, its the best scripting language that exists IMO, and has a nice ability to be refactored towards the level of abstraction that you need (ie it scales from "script" to "program" very nicely). Go gives you systems access, it's super fast, it does concurrency better than either of the other two, and exposes you to a type system. So investing further in each of these languages will set you up very well!