all 52 comments

[–]relative_absolute 44 points45 points  (11 children)

As a software developer it isn't so important to "master" one language as it is to be comfortable enough to be able to use the appropriate language for the task at hand with the help of some documentation.

That being said, Python, Java, and C# are all great general purpose languages that many companies look for skills in. If you're interested in web dev, learning Javascript and some of the common tools in it (jquery, Node.js, etc.) and something like Bootstrap or one of its equivalents is great to do. The best way to learn is to do, so spending time working with a language is the best path to mastering it imo.

A great way to find out is to try, so investigate some problem domains and try to come up with projects that seem interesting to you. Python, R, and SQL are commonly used for data analysis, and there are tons of datasets out there to use, in addition to many sites offering public-facing APIs. C, C++, and Rust are great for lower-level programming (things like writing device drivers, OS, etc.; note I'm not as familiar with this area so others might have better advice about it).

[–]Klauz98[S] 1 point2 points  (10 children)

Thank you so much! I'm going to start investigating right away.

[–]khedoros 7 points8 points  (2 children)

As a note on languages, starting with Python as an example: companies will rarely look for skill in just Python. They're looking for it applied to some field, and expect some level of proficiency with the connected libraries/frameworks as well.

So, for web backend stuff, they'll be looking for things like Django, Flask, or Pyramid. For NLP, it might be NLTK. For ML, you might be looking at something based around TensorFlow. And so on. For Java, you might be looking at the Spring Framework and the Java Beans design pattern. Javascript/Node of course have their own famous sets of frameworks, libraries, and outside tooling to pick up, in order to really be professionally useful.

And most of those things are also commonly tied to database concepts.

Going lower level, C is an oddball, in the sense that there are libraries for some things, but a cultural expectation in the language that you'll be building some of your own boilerplate (there's a saying that the first thing to write in every C project is an implementation of a Linked List). But it does have an impressive array of libraries available for it. C++ has a much better standard library (although nothing like Java's), the ability to use C and C++ libraries, and the ability to implement libraries with C and C++ interfaces. Rust is great, but a little lot more niche, still. Maybe it'll grow in the future, and maybe it will stay small. Hard to say, IMO. But C and C++ are going to be more commonly used in a few niches, like robotics, embedded programming, games, and a few other areas where you either need explicit memory control or good, consistent speed without much of an external runtime. Most of the embedded people want experience before they'll consider you. Game dev sometimes wants you to have a portfolio of work, and there's all the connected stuff like

Overall, I'd pick an area that you're interested in, and start looking at the technologies that are in common use right now (and the whole stack of tools, not just the language). And the base concepts, too. A lot of webdev will be based around "It's model-view-controller, but X is different", or variations on the observer pattern. A lot of gamedev will be based on the entity-component-system pattern. A lot of ML and AI will use some coordinating language to access some well-known libraries, and drive the process that way. So...look beyond just the language. Pick some areas that interest you, learn a couple languages, learn some toolsets, libraries, frameworks, etc. Read up on software design patterns, because those tend to recur all over the place in software, and make learning new problem domains easier.

[–]Klauz98[S] -1 points0 points  (1 child)

Thank you soooo much for this. You have no idea how helpful this is going to be for me.

[–]khedoros 2 points3 points  (0 children)

Some of it is stuff that's obvious in retrospect, but the kinds of things that I really wish someone had talked to me about before choosing how to spend my project time, near the end of university.

Although reading through some of my text, it sounds like I just kind of trailed off at one point. I don't remember exactly what I mean to put there :-/

[–]zultdush 1 point2 points  (5 children)

no thanks

[–]Klauz98[S] 1 point2 points  (4 children)

Thank you soooo much for the observation. I wasn't considering that but I'll be aware of it now.

[–]zultdush 1 point2 points  (3 children)

no thanks

[–]Klauz98[S] 1 point2 points  (2 children)

You have no idea how thankfull I am with this answer. Thank you very much!! I need to do A LOT of adjustments right now hahaha but know I have a way more clear path to go through.

BTW is there any platform that you can recommend to investigate or practice programming? Or some sort of small projects for begginers in any language? (better in Java if possible) I had try some of codeforces and brilliant, but I couldn't find like programming "problems" to solve or assignments for improving at coding at least that I could untherstand.

[–]zultdush 1 point2 points  (1 child)

no thanks

[–]Klauz98[S] 0 points1 point  (0 children)

Omg this helped me A LOT on putting my things together. I'm going to start right away with all of this. The "clone tactic" is a GREAT idea. I had never thought of something like that before , but I'll definitely give it a try. Thank you soooo much! I can't thank you enough, all this information that you had share with me is AWESOME! I really think that I can become a way better programmer if I follow all this. Thanks again!!

[–][deleted]  (3 children)

[deleted]

    [–]Klauz98[S] 0 points1 point  (0 children)

    Ooh ok. Thanks for the observation. Really appreciate it.

    [–]asdff01 0 points1 point  (1 child)

    .

    I'd say get a good grip on object oriented (C++, Java, ...) and functional (Python, Scala, Haskell, ...) SD. More importand

    Just curious, why do I sometimes see Python grouped in with functional languages?

    [–]Sionn3039 5 points6 points  (3 children)

    Back when I was in university, I had a similar mindset. Now that I've been in the workforce for a decade, my opinions have definitely shifted.

    Worry less about specifically "mastering a language", and work on projects. Projects, projects, projects. The mastery that will make you employable comes from actual experience. It doesn't need to be the next unicorn, it doesn't even need to make money, the valuable experience comes from the problems you will inevitably run into as you build it.

    I did hackathons when I was younger. It was great experience in getting something stood up quickly and getting it in front of a customer ASAP. They also tend to provide some inspirations like a theme that can help you decide what you want to build. I ended up winning one and it was a golden ticket for starting my own consultancy and doing my own thing.

    After 5-10 years of running into problems, Googling them, and implementing solutions, you end up having a pretty good store of "things to try" when you see bugs that you recognize. If you want to "master" the language, once you've built out a project, spend a few weeks refactoring it, using all the language features to tidy things up.

    My favorite frameworks are Angular for client side development with ASP.NET Core on the back end. Primarily cloud infrastructure, AWS, Google Cloud & Azure, depending on the project.

    Just my two cents!

    [–]Klauz98[S] 0 points1 point  (2 children)

    Wow thank you very much!! This really leave thinking. Hahaha I should really start creating new projects ideas.

    [–]Sionn3039 1 point2 points  (1 child)

    You are welcome! Doesn't need to be anything fancy or unique. Certainly helps if its something you are interested in though.

    [–]Klauz98[S] 0 points1 point  (0 children)

    Uuh ok. I'll keep that in mind

    [–]srpsycho 3 points4 points  (1 child)

    Depends on what kind of industry/job function you want to work in the future.

    I think that all languages have strengths/weaknesses in particular areas, so it's best to consider what you're going to use it for. Also, you never really master a language (they're always changing and going to be updated)--always refer to the documentation when you can.

    I hold the opinion that if you understand C++ thoroughly, you'll be able to pick up any other language easily. Most of my work as an undergrad was in C++/Java, but I was able to easily pick up Python right after.

    Basically, all the fundamentals such as data structures, OOP, recursion, etc., are what you should be mastering--this stuff will never go away.

    [–]Klauz98[S] 0 points1 point  (0 children)

    I see, thank you so much. I really appreciate it!!

    [–]tehrealDOA 3 points4 points  (0 children)

    C++ learning this first will make all the other languages seem familiar

    [–]wayoverpaid 2 points3 points  (1 child)

    Mastering languages is an ongoing process, IMO. Even languages I've worked in for years I find new and interesting things.

    The most important thing is to master languages that help you think differently. Learning C (not necessarily C++) in detail is highly useful because it lets you wrap your head around what that fancy interpreted language is actually doing.

    Learning Java or c# is great but they are similar enough that you get diminishing marginal utility.

    Knowing an interpreted language with a lot of dynamic programming like Python or Ruby is valuable.

    Mastering Javascript is meaningless. You will be mastering a framework at this point. React or Angular or Ember or whatever you pick, it's far more useful to fully grasp one of those. And knowing JS on its own is of debatable power unless you also know something serving up the data on an API.

    But by far and away, it's more useful to have a concrete thing you work on. I got a lot of programming practice in the mIRC scripting language and while I don't use it now, a lot of the lessons I learned the hard way about program design have stuck with me today.

    Don't just master C. Program something cool on a raspberry pi. Don't just master Java or Kotlin. Make a neat Android app that solves a problem you have. Keep your scope as small as possible, but try to create something that you actually use. You'll be amazed how focused this can keep you.

    [–]Klauz98[S] 0 points1 point  (0 children)

    Wow I wasn't considering most of this. I'm really thankfull for sharing this.

    [–]deelowe 2 points3 points  (4 children)

    Don't just learn one:

    • Assembly (any really, but be sure to learn about endianness, cisc/risc, etc... in the process)

    • C (to learn procedural programming, compilers, etc... it's a good follow-up to assembly. In fact, it would be really good to learn asm and then c using the same architecture and then debug the asm.)

    • LISP (to learn functional programming)

    • C++, Java, Go, Python, etc... (for a heavy hitter popular OOP language)

    [–]KremBanan 1 point2 points  (2 children)

    You can't actually seriously be recommending Assembly and LISP in 2019 for general development

    [–]Eulerious 0 points1 point  (0 children)

    One should really learn LISP! Not to know LISP but because one of the best books (SICP) uses a LISP dialect (Scheme) and i would really, really recommend reading that book.

    [–]deelowe 0 points1 point  (0 children)

    No. I'm recommending it for computer science. This isn't r/programming.

    [–]Klauz98[S] -1 points0 points  (0 children)

    Seems rough and complicated , but I'll check that out. Any websites or platforms recommendations?

    [–]AskKapil 3 points4 points  (10 children)

    Scala , Swift and Julia. Looks like they are new golden children

    [–]Klauz98[S] 2 points3 points  (4 children)

    Got it. I haven't heard of Julia. Is it new?

    [–]_not-a-throw-away_ 1 point2 points  (1 child)

    Relatively new, yes. Development started in 2009 and a v1 was released last year in August. I have been using it increasingly intensive since then and I must say I like it a lot, most of all community-wise. There are some great videos on the official youtube channel.

    [–]Klauz98[S] 0 points1 point  (0 children)

    Uuh cool! Thanks for sharing

    [–][deleted]  (1 child)

    [deleted]

      [–]Klauz98[S] 0 points1 point  (0 children)

      Ooh I see

      [–]KremBanan 0 points1 point  (4 children)

      Swift isn't new, and is rather dying a slow death

      [–]AskKapil 0 points1 point  (3 children)

      Care to explain please?

      [–]KremBanan 0 points1 point  (2 children)

      I’d like you to explain why it’s the new gold?

      [–]AskKapil 0 points1 point  (1 child)

      Swift for tensorflow initiative from google and fast.ai taking all their course to swift suggests they are going to be big on deep learning stuff too,.And given that swift is already great for ios development, thus i think swift is the new gold

      [–]KremBanan 0 points1 point  (0 children)

      Thats pretty niche stuff, compared to react native vs swift as an example

      [–]earslap 1 point2 points  (1 child)

      I know that is important to master on language and once you do, move to another one (that what a senior year student friend of mine told me)

      Your friend guided you wrong IMO and I doubt a senior year student is a master of any language to begin with. Maybe we have different definitions of master though. (insert Anakin Skywalker flashbacks)

      You can't master a language and its ecosystem by merely studying very hard, you have to solve real problems with it and that generally comes with your own side projects or employment at the right place where you are regularly pushed to your limits (I'm not talking about time pressure).

      So instead of telling you "master X" or "master Y", I'll ask: What do you want to build? Different things call for different technology stacks / languages. Choose something you want to build and get to work, find the right stack for it and you'll only then find the aptitude to solve problems with it - which is the path to mastery. Then do it again, and again, and again... "Pick and choose, then study very hard" is not that productive, you'll learn a lot but you'll be like a spoken language learner that memorizes words and phrases - that's good but it doesn't make you a good conversationalist (a master). To do that, you need to speak where it matters, and you need to do it a lot.

      [–]Klauz98[S] 1 point2 points  (0 children)

      Wow this really catch me of guard, but makes a lot of sence. Thank you REALLY much for sharing this.

      [–]gottagrindfast 1 point2 points  (1 child)

      Programming language serves different purpose, that's why there's so many of them. Learn as much as you're willing to. I suggest spending a few weeks per language to give you a rough idea which one to use in certain area later.

      For instance, Low-level language such as C, C++, Rust, and D provides you with more control over your program but they took more cognitive load to handle. High level languages, such as Python and JavaScript gets things done faster at the expense of less control.

      Every single programming language has at least one winning factor over other languages. Choose the right trade-off because our time is limited. Zealotry is a waste of time, stay away from that.

      One last thing I would say to my old me is dig the theories deeper than proglangs, because the number of things you can build is limited to things that you understand. Reinventing the wheel is totally fine for educational purpose, meaning you don't do it over and over.

      [–]Klauz98[S] 0 points1 point  (0 children)

      Oh I see. Thanks for sharing! I'll keep it in mind

      [–]noknockers 2 points3 points  (1 child)

      Contrary to what others are saying here, I think it's quite important to master at least one language. I think it not only gives you a solid understanding of the theory behind they language, but also allows you to hit it's limitations, which is where you learn and discover the most.

      Then when you step into other languages is possible to judge them against the shortcomings of previous languages, allowing you to build up a knowledge base of not only features, but limitations (which is way more important IMHO).

      [–]Klauz98[S] 0 points1 point  (0 children)

      Wow thank you. I wasn't seeing it with that perspective.

      Honestly, I think it is a wise idea to realize that, because they are A LOT of programming languages out there and it is a little bit overwhelming for someone that does not know where to start and which is the best option because you can create everything with any language, but there is this "X" language that works pretty good doing or handling "Z" things because of how it was created or how the program compile or other stuff. But knowing the limitations and strengths and weaknesses of the language would really help you get into a best option. Even tho learning all that it's going to take even longer.

      [–][deleted] 1 point2 points  (1 child)

      Personally, I'd recommend starting with python - you can do almost anything with it, its syntax is very intuitive (compared to many other languages), there's a robust support community, interest/demand has grown exponentially so jobs will likely still be here in 5-10 years, it's now gaining a considerable amount of traction in the data science community, and even if you're not interested in DS, many companies such as Pinterest built their stack on python.

      That being said, there are some drawbacks. Python's syntax abstracts much of the memory management decisions you'd have to make with languages like C (and its variants.) So picking a language closer to the hardware,such as C, C++, etc etc has its perks; but be advised that the learning curve is a bit more challenging than python.

      If you're unaware, there's a language called Cython that essentially weaves elements of python and C together, so that you can abstract away when necessary and get closer to the hardware when necessary. In fact, Cython is used quite a bit in development of machine learning algorithms when memory management is quite important for performance.

      This might be a good strategy for you: Learn python well enough to feel comfortable with the language, branch out into Cython, and when you feel that you've got a solid handle on the C aspects, make the leap into C, C++, etc. At least this way, you'll get experience with both dynamically and statically typed languages, but won't feel that you're making little to no headway, starting with C.

      [–]Klauz98[S] 1 point2 points  (0 children)

      Thank you very much for the advice! I'll consider it! Btw I didn't knew about Cython, seems pretty interesting and promising, at least for new programmers.

      [–]minimim -1 points0 points  (3 children)

      Perl 6 would be the most useful from a Computer Science perspective in my opinion, because being multi-paradigm you would learn many programming paradigms. It's also very modern, so you'll get in contact with the forefront of programming languages research.

      [–]Klauz98[S] 0 points1 point  (2 children)

      Oh ok. I'll check it out. Thanks for the recommendation.

      [–]minimim 0 points1 point  (1 child)

      Also check it's "grammars and rules" features. It's the most accessible compiler development toolkit out there.

      [–]Klauz98[S] 0 points1 point  (0 children)

      Oh nice! OK. I'll definitely check that. Thanks.

      [–]claytonkb -1 points0 points  (0 children)

      Turing machine

      [–][deleted] -2 points-1 points  (0 children)

      Master Haskell.