1. 55
  1.  

  2. 19

    One of the little phrases that really resonated early with me was “you should learn a lot about a little, and a little about a lot”. I’m having trouble finding the proper attribution for where I heard it.

    You need depth to frame breadth. You need breadth to de-dogmatize and relieve the constrictions imposed by having a preferred hammer (depth).

    1. 10

      I’m having trouble finding the proper attribution for where I heard it.

      Maybe try searching for “T Shaped” people? That’s how I’ve heard it phrased in some places.

    2. 5

      I welcome feedback on style, substance, or anything else related to this post. I am far from the most eloquent writer in the world.

      1. 6

        With languages, like with many other things, “knowing a few principles allows you to avoid knowing many facts” (as some dharmic spiritual figure said ;).

        If you know the basics of formal languages and automata, something about typed lambda calculi, classification of object systems and their classic issues etc., you can make fast and loose assesments of programming languages that are most likely correct. You can also learn new languages much faster.

        You can also find some amusement in spotting instances “reinvented $concept” and “clearly knew about $concept but intentionally picked a non-standard name for it” in language docs.

        1. 4

          I tend to assume that pithy quotes attributed to dharmic spiritual figures are things the dharmic spiritual figure never actually said. My first thought upon seeing the quote attributed to Gandhi in the front matter of the site is that he probably didn’t actually say that. And indeed, googling the text of the quote seems to turn up a lot of pop spirituality sites and nothing providing a citation for where and when Mohandas Gandhi might’ve actually said this or something similar. So I’d either find a citation for the quote and provide a link, so that people who have predispositions like mine can easily confirm that the quote is a thing Gandhi actually did say at some point; or remove the quote.

          1. 3

            Thank you for pointing that out. I’ll try to find some other creative commons image that embodies the idea of deliberate practice.

            In point of fact, you’re the second person to negatively comment about the image so the post will go image-less, which may make people happier :)

          2. 4

            I think your article is very insightful.

            Software engineers are not immune to fads and religious-like zealotry. “Learn one bazillion languages” is, in my opinion, a good example of that. In fact, I often think software engineers often exhibit too much religious-like zealotry for certain tools, languages, editors, operating systems, etc. I think many software engineers also have an inflated sense of intellectual superiority, as well, and it results in them not questioning their own biases sufficiently. (Note: I’m a software engineer.)

            Getting exposure to other languages is great and all, but eventually, you need to pick a tool (hopefully the correct one for your application domain) and get busy.

            A related subject is that software engineers often forget to factor in the ecosystems of the tools and languages they choose. A technically inferior language might be a better choice than a technically superior one, because the ecosystem that surrounds it is so much better.

            1. 5

              The giant image at the top aggravates me, probably irrationally. It’s huge and yet somehow still manages to cut off who the quote is from. And then it’s immediately repeated!

              I think you’re presenting a bit of a false dichotomy. The quote is just saying: broaden your horizons, try new things, don’t end up like the guys that are still stuck writing COBOL. It’s not saying you should spend all your time learning new programming languages or that you shouldn’t build expertise. You can try new things while also building expertise in what you already know. In fact, learning new things and seeing new perspectives will help you become a better Python/C++/Java/Haskell programmer.

              If you’re a professional software developer, then your work hours are your time for building your expertise in your chosen platform. If you’re a professional Java developer, then you learn how to write better Java at work by writing Java, reading about Java, learning about Java, etc. ‘Solve real problems using the platform of your choice’ at work. ‘Build deep, featureful applications’ at work. Your work will appreciate it.

              Experimenting with new programming languages is something you can do at home. It’s personal development. It doesn’t conflict with building your Java expertise. They’re totally separate in time, space and purpose. And the book does say ‘once a year’. It isn’t suggesting you learn a new programming language every week!

              Sorry if this comes off as very critical, but you did ask for feedback! I do agree entirely with your ‘parting thoughts’, for what it’s worth.

              1. 3

                The giant image at the top aggravates me, probably irrationally. It’s huge and yet somehow still manages to cut off who the quote is from. And then it’s immediately repeated!

                [Passive aggressive and ultimately pointless snark about Wordpress themes removed.] I removed the image. Thanks for letting me know. I wasn’t smart enough to take this action on an initial read of your comment, but @Hal_Spacecake ’s note about the quote being factually incorrect was the tipping point :)

                I think you’re presenting a bit of a false dichotomy. The quote is just saying: broaden your horizons, try new things, don’t end up like the guys that are still stuck writing COBOL. It’s not saying you should spend all your time learning new programming languages or that you shouldn’t build expertise. You can try new things while also building expertise in what you already know. In fact, learning new things and seeing new perspectives will help you become a better Python/C++/Java/Haskell programmer.

                That’s interesting. I don’t see it as such because I’m not in any way asserting that the advice itself is telling anyone to do things they shouldn’t do, I’m saying I mis-used the advice, using it as an excuse to feed my impetuous desire to play with the latest bright shiny thing as opposed to doing the good hard work of actually building my core skills.

                If you’re a professional software developer, then your work hours are your time for building your expertise in your chosen platform. If you’re a professional Java developer, then you learn how to write better Java at work by writing Java, reading about Java, learning about Java, etc. ‘Solve real problems using the platform of your choice’ at work. ‘Build deep, featureful applications’ at work. Your work will appreciate it.

                Experimenting with new programming languages is something you can do at home. It’s personal development. It doesn’t conflict with building your Java expertise. They’re totally separate in time, space and purpose. And the book does say ‘once a year’. It isn’t suggesting you learn a new programming language every week!

                This is at the very least not true for everyone. For me, in order to build a skill as complex as truly mastering a programming language, I can’t be simultaneously filling my brain with alternative syntaxes and paradigms because if I do I will lessen my ability to master my chosen language.

                Note that this isn’t forever, and that most people have already mastered a programming language or two in college, or early on in their professional career. The oddball path my career took never led me to that place, and I was never smart enough to put in the extra time, blood, sweat and tears to get there myself, so here we are. Until I DO get there, at least for my particular limited brain, I have no business studying other languages, no matter how much I might want to, until I master at least one.

                Sorry if this comes off as very critical, but you did ask for feedback! I do agree entirely with your ‘parting thoughts’, for what it’s worth.

                No thank you VERY much for taking the time to comment! I sincerely appreciate every word, even though I may not initially agree with all of it.

                1. 2

                  Why do you consider yourself to not have mastered python? What’s your metric?

                  1. 1

                    Because there are a number of language features I am still not comfortable using and lack a solid understanding of. For instance:

                    • Nested list / dictionary comprehensions
                    • decorators (Get them in concept. Python’s implementation still confuses me.)
                    • Data classes
                    • Asyncio
                    • Test mocking, fixtures, and fakes.

                    Also, I need to write a few more KLOC of rigorously tested Python.

                    Make sense?

                    1. 2

                      I think an important step close to mastery is having a good understanding of what’s missing.

                      So I’d say your on a good track. :-)

                      1. 1

                        It makes sense enough, I suppose. Though any language that’s been around will always haven edges you’ve not dived in to. At least, for me, that’s a reality I’ve accepted.

                        Learning how to test better, though, makes plenty of sense

              2. 5

                Oh, you make me want to share my personal take on this:

                I am a programming language junkie. In the 90s I used to download, compile and run minimal programs on just about every language (and compiler tools) I found in my way. I even had my Prof. sign an NDA with Ericsson for Erlang before it was open-sourced. The fix was enormous. I had strategically chosen not to invest in C++ and Java because in the same time I wanted to learn more languages. But in the end I did not write anything of value in any of these. Only in C and Perl.

                These days I want to learn Groovy (because of Jenkins) and Go (Kubernetes and the like). But people pay me to train them in Python. It is impossible for me to master all three to the level I’d want, so I’ve decided like you @feoh to stay with Python mostly and play around with the other two. I so wanted to add Haskell and Clojure to the mix, but have decided against. There will be diminishing returns from a continuous loop of learning without producing.

                Thanks for writing that and enabling me to comment on it.

                PS: CheckIO is also another place to practice Python and JavaScript.

                1. 1

                  CheckIO is pretty darn great! I’ll add it to the article.

                2. 4

                  I think that the message is an important one. I only follow the advice because I am forced to at work ;)

                  That said I think that my perspective on software engineering approaches is wider than of most of my colleagues (most of them very smart, and better at many things). It is quite hard to communicate my knowledge to people with a more narrow perspective, though, and to be honest, much of the insight is hard or impossible to objectify.

                  1. 4

                    It was something I was doing. A local programmer kept telling me to pick one, absolutely master it, and do the other stuff on the side. That’s what he did to get to senior developer in Java shops. Probably the best advice.

                    There is another take that has many supporters. Instead of “languages,” one can learn different “paradigms” via languages that embody them. This teaches your mind to look at problems in new ways, expressing solutions differently. Specific problems might lend themselves well to specific paradigms. People often find that they can use some of what they learned in their main language that wasn’t designed for that paradigm. Examples include using a functional style with an imperative language, relational operators for databases, and functional-reactive programming for UI’s.

                    I’d say do both with mastery of something useful being the first option. Heck, the languages of other paradigms might even make for an occasional break from mastering the main one. Kind of go back and forth. Maybe have parallel tracks where you get deeply into the most useful ones while experimenting with mind-expanding or fun languages. I doubt that would cause major problems. Many of us have done that for school or work reasons from what I can tell.

                    1. 3

                      I really enjoyed the links that you provided, specially the ProjectEuler.

                      1. 3

                        I’ve often thought about that advice as being somewhat pivotal in my ‘learning’ as a programmer, and also somewhat hurtful. If you don’t have a grounded ‘base’ language, you end up with a mental pidgin of all the languages you’ve learned. Saying to yourself “ugh I wish I could do X in Y language” or even more mundane, using the wrong delimiters, punctuation, basic function names, etc.

                        I suppose it’s a bit like knowing multiple spoken languages in that it’s easier to grasp for the first word, instead of grasping for the first word in the language you’re speaking in at the time.

                        Well written and nicely short, which I appreciate. :)

                        1. 2

                          This has to do with judgement, maturity, and learning. Someone has judge when to go deep, and to go broad.

                          One day, Python will be the COBOL or Java of its day. Unwanted, unpopular. There will be meaningfully better tools.

                          But if you don’t know what you’re doing in your current system of choice, you’re going to have a bad time.

                          Knowledge gives you the edge; wisdom lets you know where to cut.

                          1. 1

                            This has to do with judgement, maturity, and learning. Someone has judge when to go deep, and to go broad.

                            Yes, and good judgement stems, at least in part, from maturity.

                            When I formed the destructive habit I document in the article, I was very young and fresh out of the chute. Only decades later can I see the big picture for what it is.

                            Knowledge gives you the edge; wisdom lets you know where to cut.

                            Makes me think of “Measure twice. Cut once.” :)

                          2. 2

                            Bit late to the party, but very good article.

                            I think I’m bad at the mastering part, I grow tired of using only one language for excessive amounts of time, and so I wouldn’t say I’m really good with more than 1-2 languages, maybe none? - but I have professionally used a few for several years at a time, good enough to not be total junior level when it comes to the pure coding part (as opposed to the architecture and general software part).

                            1. 2

                              I wrote a nice article about this 4 years ago now. https://ecc-comp.blogspot.com/2016/10/a-few-thoughts-on-ben-northrops.html I feel it doesn’t warrant a submission just to reduce similar posts showing on the front page.

                              1. 1

                                I’m not sure I agree that this doesn’t warrant a front page posting. There’s some great and unique flavor in there that mine doesn’t touch on.

                              2. 2

                                One thing that is notable is that the advice was to learn at least one new language a year, not one new language every month or two.

                                It’s very possible to build depth in a core language, while exploring rather deep into a new language for a year.

                                I do think there is a point of diminishing returns with learning new programming languages, but there’s also cases of not being ready for an idea. Gene Kim, for example, picked up Clojure after having been away from writing software development for years, and by everything he’s had to say, it’s been a revelation for him.

                                For me, it took me a while of experimenting with different languages to find Go, and then Nim. And there are things I still want to explore, like logic programming.

                                But, as I’ve explored, I’ve also worked in C#, which I’ve gained a lot of both depth and breadth in.

                                1. 1

                                  One thing that is notable is that the advice was to learn at least one new language a year, not one new language every month or two.

                                  Yes. The point of the article is that I misused the advice and used it as an excuse to feed my bad habits :)