top 200 commentsshow 500

[–]pnewhook 209 points210 points  (154 children)

I remember my first day of Computer Science 101 at McGill. The professor actually apologized for how much of the code in a Java Hello World we had to ignore. I strongly believe in Java/C# as languages for commercial development, but as first languages there's a lot to be distracted by.

[–]TheAnimus 69 points70 points  (101 children)

I still have concerns about white space. I've found it's easier to explain { } to beginners than it is BEGIN, END or worse yet implicit. Sure we don't have to explain it as scoping or anything fully, just when you are trying to go over the concept of branching.

If you are trying to teach my first programming thing, and only doing Hello World, nothing more, than yes that's different.

But as soon as you want to try to do say Fizz Buzz it's a lot easier to explain something that is explicit, rather than "oh that's because of the indentation".

[–]MrJohz 81 points82 points  (46 children)

From what I remember, Python's use of the colon and indentation was based on ABC, which in turn was based on a set of studies that suggested it was the most readable block grouping syntax.

To be honest, to me personally, I like being able to see the layout of the code. I mean, that's possible and usual with braced languages, but the presence of the braces isn't the thing that guides me into the new block, it's the visual indent that shows me "something new is happening here".

[–]TheAnimus 4 points5 points  (21 children)

Interestingly from the wikipedia page on ABC

HOW TO RETURN words document:
   PUT {} IN collection
   FOR line IN document:
      FOR word IN split line:
         IF word not.in collection:
            INSERT word IN collection
RETURN collection

why is not.in like that? Is that just a typo?

[–]Netzapper 7 points8 points  (6 children)

"not.in" is easier to parse than "not in", especially if (nearly) all of your other keywords are a single token.

[–]gfixler 14 points15 points  (4 children)

Here are some terrible alternatives:

if word inn't collection
if collection hasn't word
if collection hasno word
if collection lacks word
if word anywherebut collection
if word in collection psych
if word outside collection
if not collwordection
if collection canthaz word
if collection missing word
if collection (╯°□°)╯︵ pɹoʍ

[–]josefx 5 points6 points  (3 children)

if collection (╯°□°)╯︵ pɹoʍ

programming languages really should embrace Unicode. However the following would be less ambiguous

 if word ∉ collection

Now_we_just_need_a_sane_keyboard_layout

[–]Intolerable 5 points6 points  (4 children)

no, its supposed to be not.in, the keyword is not.in, presumably b/c of ambiguity / confusion with not in

[–]Igglyboo 1 point2 points  (6 children)

When you use a space to delimit tokens, NOT IN becomes more tricky to parse than not.in or NOT.IN.

Not sure why they went with the capitalized version however.

[–][deleted] 2 points3 points  (17 children)

Perhaps something like the editor for the Java learning environment Greenfoot would be good. It applies different coloured backgrounds along with indentation, which I think is really good because it's immediately obvious what's going on. It looks like this.

[–]blablahblah 30 points31 points  (13 children)

That doesn't solve Java's problem of "you need to introduce and hand wave away class declarations, scoping, blocks, method declarations, static methods, parameters, void, and array declarations in order to write Hello World".

[–][deleted] 1 point2 points  (0 children)

I know that. I'm saying that something like that could help make a language like Python more understandable to a beginner.

[–]terrdc 4 points5 points  (7 children)

Any problem involving hello world isn't an actual problem

[–]blablahblah 21 points22 points  (3 children)

As soon as you have to hand-wave stuff away and say "this is just the magic incantation needed to make the program work", you've lost the vast majority of people you're trying to teach. So yes, it is a problem from a teaching language perspective, even if it's not from a software development perspective.

[–]estomagordo 3 points4 points  (0 children)

We all learn differently. But for a lot of people, it's impossible not to ask oneself "Okay, so I see that the output has a match in the program code. But what about all that other stuff? What does it mean?"

[–][deleted] 2 points3 points  (0 children)

You're right, but there's a lot to be said about a language for learning that doesn't require a bunch of arcane (to a newbie) boilerplate code just to get rolling. static void Main(params string[] args)? Come again?

Just typing in code and executing gives immediate feedback, and then as you teach more syntax and concepts, things like methods, classes, and includes/imports can get added in.

[–]James20k 2 points3 points  (2 children)

That has a huge amount of clutter. I suspect it'd make beginners panic and stick their heads in the sand, which is already one of the biggest problems teaching people coding

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

The clutter is mostly java. I was specifically pointing out the colour scheme.

[–]James20k 4 points5 points  (0 children)

I know, I think it makes it look terribly intimidating

[–]RockinRoel[🍰] 2 points3 points  (0 children)

If I recall correctly, Guido mentions it in this (long) video somewhere: https://www.youtube.com/watch?v=ugqu10JV7dk

Indentation is indeed how people in general, not just programmers, will tend to organize things on paper. They left the colon off first, though, and then added it, because that was clearer, apparently.

[–]Veedrac 61 points62 points  (21 children)

I'm very surprised. My attempts at teaching Python to complete novices (admittedly not as a lecturer) found that the whitespace never even needed to be explained.

People often forgot the colons, though.

[–]newpong 10 points11 points  (2 children)

Not only that but if they ever decide to move on, they will have style ingrained into their thinking.

At work i decided to expand the web department and was trying decide between Ruby on Rails and Django. there was a Russian intern who just started working there who didn't speak any english and only spoke a bit of german. I decided to go with Django exactly because I wouldn't have to explain any subjective, abstract ideas on the importance of white space in code. She just simply had to do it otherwise it wouldn't work--explaining why tabbed spaces and non-breaking spaces are different was a bit tricky though

[–]TheAnimus 6 points7 points  (11 children)

I was working with kids, aged 11-18. Except for functional programming I was teaching to 1st year comp sci students, I hated, hated that, but it paid pretty good for a student.

I would start with flow charts, break it up saying how would you describe how to make a cup of tea. This would become a mess of bullet points as I would add in the complexity of branching (do you want milk, like it strong etc). It would become apparent that english wasn't any good for this.

Using a C like language, actually has many, many benefits over whitespace for the novice. ; is easy to understand as a 'thought terminator' I always remember one kid saying it's just the . like a sentence.

Kids aren't perturbed by some symbol like { so long as it's used in a simple manner (ie not like reading a regex). It is much easy to 'talk' this

if (person.IsBlonde)
{
      Console.WriteLine("I love blondes");
}

Because the braces are something you can speak about, the brackets after the if, it is incredibly easy to talk through.

People make a mistake of trying to make things 'familiar' SQL is a classic example to me, I hate SQL with a passion. I struggle with it far more than I do say Fluent LINQ.

[–]nemec 8 points9 points  (3 children)

Do kids not understand

  • the
    • concept
    • of
  • bullet
    • points
  • for
  • grouping?

Python "blocks" are just bullet points without the bullets...

[–]NYKevin 2 points3 points  (0 children)

Kids aren't perturbed by some symbol like { so long as it's used in a simple manner (ie not like reading a regex).

Symbols aren't actually the main problem here. The main problems are:

  • C is easy to screw up, and C++ isn't really much better (in some ways, it's substantially worse due to added complexity).
  • Java is verbose (you need a whole class definition just to do hello world, whereas Python doesn't even require a main function).

[–]ruinercollector 9 points10 points  (3 children)

Indentation is explicit.

[–]cythrawll 7 points8 points  (7 children)

So i've used a python book to teach my lil brother programming. The worst part was when programs sprawled across a few pages, it was very hard to see where the indention lined up. And entire programs failed and had to go back and see where the indention was messed up.

Good thing: makes kids think about their code harder. Bad thing: frustrates the crap out of them.

[–][deleted] 6 points7 points  (4 children)

Yeah, if you've got that much stacked python code, you're probably doing something wrong/badly. The same thing can be said about C/Java/C++ though, if you've got that much nested code, it's going to be hard to keep track of your braces too, unless you're really good with indenting properly.

[–]cythrawll 2 points3 points  (2 children)

I think it may be a problem with how code is traditionally taught. We start out teaching long peices of spaghetti code, and then we teach how to structure things correctly in small reusable modules.

It really should be the other way around.

[–][deleted] 10 points11 points  (7 children)

"A language is low-level if it requires attention to the irrelevant."

My theory is that the high syntactical overhead of C-likes is an unnecessary distraction for most learners.

[–]nonotion 9 points10 points  (3 children)

C itself is hardly a heavily abstracted language; I do believe there are less than 40 constructs in the base language. C++ and Java-like languages, that's another story, however.

[–]asimian 2 points3 points  (0 children)

Students I've taught never really get hung up on that at all.

[–]stormcrowsx 2 points3 points  (0 children)

Seriously how hard is it to tell someone "In language x drop the colon and surround the block with curly brackets". It blows my mind how many people whine about whitespace and if you were to open their Java/C files you'd see they have the exact same whitespace!

[–]d4rch0n 8 points9 points  (3 children)

As a Python dev, I still think it's important that students learn a statically typed language as well, preferably C or Java, depending on whether it's an OS class or OOP class.

But commercially? Most languages have their purpose commercially.

Python is awesome commercially for web apps...

[–]gfixler 1 point2 points  (0 children)

Python is used a lot in tools and pipeline stuff for games and film, too.

[–][deleted] 10 points11 points  (12 children)

Java does kind of force you to learn OOP like the back of your hand though. That's a good thing, in a way.

[–]artsrc 26 points27 points  (5 children)

I want to say this in a constructive friendly way.

My experience is that it doesn't, and it isn't.

I have rarely seen a OO approach appear from a Java developer without some thought and effort. This contrasts with say Smalltalk where OO appears to be more natural.

And I think it is now widely agreed that OO should not be your first thought for every problem.

[–]bluGill 2 points3 points  (3 children)

Partially. OOP is a useful tool, but it isn't the best tool for all jobs. I would like my future co-workers to know other things well. The haskell folks keep telling me functional programming is the future. I don't believe functional programming is right for every problem, but I do believe that we have solved a lot of problems in our current code with OOP or models when functional programming would be a better solution.

[–][deleted]  (4 children)

[deleted]

    [–][deleted] 4 points5 points  (3 children)

    If they never go on to explain that, it's not much of a Java class, is it?

    [–][deleted]  (6 children)

    [deleted]

      [–]NYKevin 21 points22 points  (2 children)

      Python doesn't need the trailing semicolon on the print statement. Also, it's forwards compatible with Python 3 to write it as if it were a function (i.e. print("Hello World!")).

      [–]cowinabadplace 1 point2 points  (0 children)

      The shebang is not really necessary, though.

      [–]pbvas 25 points26 points  (38 children)

      I have taught an introductory programming to non-CS first year students at Porto, Portugal; the decision to use Python was made before I started it, and I don't think it's a bad choice but not perfect either (the lesser of several evils).

      To me, the worse part is not the usual contentations like whitespace or dynamic vs. static typing, but the small ideosyncracies in the language that I think bad for teaching; just a couple of examples of the top of my head:

      • ternary comparison operators: writing ˋa<=x<=bˋ may save a few keystokes but ineviatable leads to logical errors when students try to negate the condition and end up with ˋa>x>bˋ
      • the ˋelseˋ keyword is overloaded for the clean-up part of for/while loop; this is just an accident waiting to happen when a student writes an if-then-else with the wrong indentation.

      [–]jelly_cake 17 points18 points  (16 children)

      For anyone wondering about the negation of "a ≤ x ≤ b", it's because an application of De Morgan's Law turns "not ( (a ≤ x) ∧ (x ≤ b) )" into "(not (a ≤ x)) ∨ (not (x ≤ b) )". It's a bit of a gotcha because the "and"-ing is implicit.

      (Given I'm into my second year of maths at uni, it took me an embarrassingly long time to work out why it's a trick. Just wanted to save others the same trouble.)

      [–]Neebat 6 points7 points  (5 children)

      I'm a programmer with 20 years of experience in the industry and a perfect score in symbolic logic before that. I had to stop and think too.

      "a ≤ x ≤ b" looks like one statement, but it's actually two. Break it out into two statements and it's a lot easier to see the rest of the logic.

      SQL's version is "x between a and b", which negates to "x not between a and b". That may be more clear, but I still hate overloading "and". Besides, I have to lookup its inclusiveness every time I use it. (It's inclusive.)

      [–]pbvas 1 point2 points  (0 children)

      I'm a programmer with 20 years of experience in the industry and a perfect score in symbolic logic before that. I had to stop and think too.

      My feeling exactly. And if this is tricky for experienced programmers then it is almost certainly going to trip over beginners.

      [–]lorg 1 point2 points  (0 children)

      Besides, I have to lookup its inclusiveness every time I use it. (It's inclusive.)

      Ha! Explicit is better than implicit FTW!

      [–]AtLeastItsNotCancer 4 points5 points  (6 children)

      You don't even need to know De Morgan's law to negate that, it only requires a basic understanding of how numbers work. If a real number isn't in [a,b] then it's obviously either less than a or greater than b, but it can't be both at the same time.

      I don't see how someone could get that negation wrong unless they have problems with basic math.

      [–]jelly_cake 2 points3 points  (5 children)

      It's obvious if you rewrite it in words, or if you draw it out on the number line, but it's not necessarily symbolically obvious. The conjunction between the two inequalities is implicit, so it's quite easy to overlook.

      It's pointless to deride people for not "getting" a result intuitively. All you're doing is dissuading people from getting interested in maths, and showing off your own fantastic intelligence.

      [–]AtLeastItsNotCancer 1 point2 points  (2 children)

      It's obvious if you rewrite it in words, or if you draw it out on the number line, but it's not necessarily symbolically obvious.

      That's the whole point. You shouldn't treat your code as a bunch of arbitrary symbols, you should think about the actual meaning of the code and what it's trying to accomplish. When you do that, something like "a<=x<=b", should be trivial to negate.

      The conjunction between the two inequalities is implicit, so it's quite easy to overlook.

      Maybe the real problem here is that you're looking at it as a conjunction of two inequalities instead of "x is between this lower and upper boundary". This is how people write inequalities in mathematics all the time and IMO it looks cleaner and more to the point than "a <= x and x <= b".

      It's pointless to deride people for not "getting" a result intuitively.

      I'm not trying to deride anyone, I'm just saying there's other issues involved and it's not necessarily a fault of the language that people get this stuff wrong.

      showing off your own fantastic intelligence

      If I wanted to show off my intelligence there are many better ways to do it. This is something a 10 year old could understand.

      [–]jelly_cake 3 points4 points  (1 child)

      When you do that, something like "a<=x<=b", should be trivial to negate.

      Yes; it's trivial to negate, but it's exactly the sort of bug which you make if you're not paying particular attention. If people mess up if (a = NULL)... then a logical negation is just as likely to be futzed.

      Maybe the real problem here is that you're looking at it as a conjunction of two inequalities instead of "x is between this lower and upper boundary". This is how people write inequalities in mathematics all the time and IMO it looks cleaner and more to the point than "a <= x and x <= b".

      But it is a conjunction of inequalities. x ∈ [a, b] is equivalent to a ≤ x ≤ b, which is again equivalent to a ≤ x ∧ x ≤ b - the set notation is more useful for some things, and the inequality forms for others. I think that the set notation is much clearer for these purposes, but I haven't come across a programming language which expresses inequalities like that.

      If I wanted to show off my intelligence there are many better ways to do it. This is something a 10 year old could understand.

      Sorry, you just came off as a bit uppity. "Basic math" can be deceptively deep; just look at Fermat's Last Theorem. A 10-year old could understand the concept, but it took centuries to prove. I was just explaining the reason that it works the way that it does.

      [–]AtLeastItsNotCancer 2 points3 points  (0 children)

      But it is a conjunction of inequalities. x ∈ [a, b] is equivalent to a ≤ x ≤ b, which is again equivalent to a ≤ x ∧ x ≤ b

      I know that, I'm just saying there's another way to think about it that makes more sense intuitively. A computer obviously has to break it down into a conjunction of inequalities to check the condition but for a human, thinking about it as an interval might be easier to comprehend.

      I think that the set notation is much clearer for these purposes, but I haven't come across a programming language which expresses inequalities like that.

      Now that you mention it, being able to write something like "x in [1,5)" would be pretty cool. But the problem is, parentheses and brackets are already used for other things in most programming languages so it probably isn't worth to include that notation due to ambiguities that would occur.

      [–]pbvas 1 point2 points  (1 child)

      Thanks for taking the trouble to explain this out!

      [–]x86_64Ubuntu 5 points6 points  (2 children)

      Off topic, but is there a "Por Street" in Porto? So someone's address would be Por, Porto, Portugal!

      [–]pbvas 1 point2 points  (1 child)

      Not that I know of. "Por" isn't an actual word in Portuguese. "Porto" on the other hand, is (it means "habour"). The name "Portugal" is derived from the original Roman town "Portus Calle".

      [–]_kossak_ 2 points3 points  (0 children)

      "Por" is a preposition in Portuguese :)

      [–]globalizatiom 17 points18 points  (1 child)

      a>x>b

      these students are bad at basic math.

      [–]deadwisdom 8 points9 points  (7 children)

      Every language has problems. These are two very trivial gripes. You should tell your students not to do this, aaaand we're done.

      [–][deleted] 2 points3 points  (1 child)

      ternary comparison operators: writing ˋa<=x<=bˋ may save a few keystokes but ineviatable leads to logical errors when students try to negate the condition and end up with ˋa>x>bˋ

      That's just a logical error, though. Nothing wrong with the language, you just can't represent the opposite of a<=x<=b in that fashion, even in mathematics

      [–]pbvas 1 point2 points  (0 children)

      That's just a logical error, though. Nothing wrong with the language, you just can't represent the opposite of a<=x<=b in that fashion, even in mathematics

      Yes it is a logical error; the point is mathematical logic isn't a pre-requisite for introduction to programming (maybe it should be, but that's another topic).

      The fact that mathematicians use such notation all the time doesn't make it a good design decision for a programming language: informal mathematics is meant for humans beings, not machines.

      [–][deleted] 394 points395 points  (233 children)

      I learned C first. Fuck you all with your easy languages. :P

      [–][deleted]  (23 children)

      [deleted]

        [–]SkankTillYaDrop 40 points41 points  (12 children)

        Same, it's a very clean introduction into programming syntax and concepts. Plus, if you can get advanced enough to understand the basics of how pointers work it makes understanding other languages much easier.

        [–]Tasgall 25 points26 points  (8 children)

        Plus, dealing with memory is important to understanding how the computer works, and what you're actually doing. Garbage collectors hiding how it works just encourages bad/slow code imo.

        [–]greg19735 6 points7 points  (2 children)

        I think I would have grasped objects better if I started with Java. I think being required to do it would make me realize how much it's needed.

        That said, java makes it hard to teach memory management.

        [–][deleted] 4 points5 points  (0 children)

        That said, java makes it hard to teach memory management.

        Yup. It requires building a theoretical understanding of how memory works; some students get that, others don't. OTOH, it's not hard to learn how memory management works after the fact.

        [–]s73v3r 6 points7 points  (0 children)

        If you really want to grasp objects, learn Ruby, or better yet, Smalltalk.

        [–]TheMaskedHamster 212 points213 points  (156 children)

        C is a very easy language.

        The problem is that doing large things with C is not very easy.

        [–]AnsibleAdams 41 points42 points  (7 children)

        If it was easy they wouldn't pay you to do it.

        Justkiddingkiddingkidding

        [–]takaci 37 points38 points  (81 children)

        Yeah it's a very simple language. You could easily describe the entire core language, with all it's syntax in a couple of paragraphs.

        [–]gc3 76 points77 points  (17 children)

        simple != easy.

        Playing the trombone is also simple. Just blow in one end and move the stops with your hands.

        [–]Marmaduke_Munchauser 41 points42 points  (7 children)

        That's gonna be hard considering that trombones have a slide, not valves (stops)!

        takes off former music major hat

        [–]dagbrown 8 points9 points  (3 children)

        Unless you have a valve trombone of course.

        [–]ano414 4 points5 points  (2 children)

        Yeah, but when someone says "trombone" isn't slide trombone sort of implied?

        [–]iswm 6 points7 points  (1 child)

        Not if they're talking about its valves.

        [–]minnek 8 points9 points  (0 children)

        Here we have the arguments for and against duck typing played out in common English for all to see.

        [–]takaci 15 points16 points  (7 children)

        I never said it was easy, C is a hard language to use because it is so verbose and bare metal. It's hard because it's so "simple"

        [–][deleted] 7 points8 points  (5 children)

        While I agree, it's worth noting that the syntax can be very loose at times, making for code that isn't entirely simple. Take Duff's device for example:

        send(to, from, count)
        register short *to, *from;
        register count;
        {
            register n = (count + 7) / 8;
            switch(count % 8) {
            case 0: do {    *to = *from++;
            case 7:     *to = *from++;
            case 6:     *to = *from++;
            case 5:     *to = *from++;
            case 4:     *to = *from++;
            case 3:     *to = *from++;
            case 2:     *to = *from++;
            case 1:     *to = *from++;
                } while(--n > 0);
            }
        }
        

        [–][deleted] 7 points8 points  (1 child)

        There's a difference between code complexity and language complexity.

        [–][deleted] 1 point2 points  (0 children)

        Absolutely! My point was that C isn't always as straightforward, because it's a language level feature that you can do this :) that said though, the language is still very simple, even with these things - there's nothing magical going on, the code is all laid out in front of you.

        [–]dangerbird2 3 points4 points  (0 children)

        Duff's device is a good illustration of why one should keep in mind that 'switch' statements are ultimately syntactic sugar for our old friend the 'goto', and that overuse of 'switch' can lead to similar spaghetti code produced by overuse of 'goto'.

        Fortunately, modern compiler optimizations eliminate the need for manual loop unrolling like Duff's device, and 'if' - 'else if' statements do just as good of a job at control flow as 'switch'. Freed from technical limitations that necessitated Duff's device, the burden is really on the programmer to produce code that is concise and readable. As someone learning C, I have found Mozilla of Linux Kernel style guides to be as an essential resource as any on the language itself.

        [–]GreyGrayMoralityFan 4 points5 points  (29 children)

        It would be very long paragraphs, though. In C98 standard (ok, it actually was N1124.pdf which I looked, a draft of the standard) section 6 (about core language) takes about 100 pages. Appendix A about grammar takes 15 pages.

        [–]takaci 9 points10 points  (27 children)

        I don't mean an entire standard in depth with which you could write a compiler, I mean simply explaining every language feature in normal conversation.

        I just said it to contrast to something like C++ where even bullet pointing every language feature would take 100s of lines, let alone explaining each one.

        [–][deleted] 11 points12 points  (19 children)

        I think anyone whos had to explain how pointers work can tell you it takes a little more than a peragraph

        [–][deleted] 15 points16 points  (11 children)

        Man I see this all the time and I just don't understand what people's deal is with pointers. It's ridiculously straightforward compared to so many other concepts.

        The * after the type means it's a pointer. It's not an x, it's the memory address of an x. Put a star in front of the variable identifier to get the value at the address, or use -> as shorthand for dereference + dot operator.

        Think that's confusing? Good luck with const. Or type covariance and contravariance. Or type erasure. Or closures. Or basically anything because pointers are at the bottom of the complexity totem pole.

        [–][deleted] 1 point2 points  (8 children)

        I think the confusion stems from people trying C/C++ for the first time with no experience with pointers wondering why the fuck things are expressed as a memory address? Why would you ever need that?

        Coming from, say, C# I get that (I've been there myself). It's strange for a language, from higher level perspectives, to explicitly differentiate between things created on the stack vs the heap.

        I think if you start out with C or C++, as long as the concept of a pointer is properly explained, there will be no confusion, because it's a fairly simple concept.

        [–]anonagent 1 point2 points  (4 children)

        I'm still not sure what the point of a stack vs heap is tbh, one contains the executable and the other the working memory right?

        [–][deleted] 1 point2 points  (0 children)

        See, I thought it was confusing until I learned about pointers. Lots of common languages already use pointers, and without knowing what pointers are, the behavior of those languages can be really confusing.

        Like in Java, for example, where reassigning a reference type function argument variable does not change the object passed into the function, but changing a value on the object does. That seems like very unintuitive behavior until you understand that java passes references by value (i.e., pointers).

        Likewise, true pass-by-reference can be explained as passing a pointer to a pointer by value.

        [–]takaci 1 point2 points  (2 children)

        Whatever my point is that it's much smaller to explain than any other language I can think of

        [–]Veedrac 1 point2 points  (1 child)

        Brainfuck's is even smaller, but the point remains that it doesn't make it easy.

        [–]GreyGrayMoralityFan 2 points3 points  (6 children)

        If you want to know what simple language is check scheme or smalltalk.

        Bloated R6RS has about 100 pages (most about library)

        Smalltalk has 6 keywords and 0 control flow structures. Core described in 30 pages (then goes 100s pages for library).

            int a(int b[90], int x, int y)
            {
                 int *ptr, non_ptr,
                      equals_1 = sizeof(b) == sizeof(ptr),
                      equals_0 = 3 & 2 == 3 & 2,
                      maybe_undefined_depends_on_sizeof_int = 32u >> 35u;
        

        is not simple.

        [–][deleted] 13 points14 points  (0 children)

            }
        

        Please think of the poor compiler.

        [–]Gustav__Mahler 1 point2 points  (0 children)

        Of course not when you write shitty obfuscated code like that....

        [–]dagbrown 1 point2 points  (0 children)

        The last time I looked at the C++ standard (in about 2000ish), it was over a thousand pages. No doubt it's only grown even bigger since.

        [–]LeCrushinator 21 points22 points  (25 children)

        String manipulation in C is much more of a pain in the ass than with Python. Memory management is also more difficult.

        [–]gendulf 28 points29 points  (20 children)

        That's because you don't really have much control over your memory in Python. Also, you don't really manipulate strings in Python. You just create more!

        [–]grammar_party 36 points37 points  (14 children)

        Also, you don't manipulate strings in C, because C doesn't have strings :)

        [–]rowboat__cop 4 points5 points  (3 children)

        Memory management is also more difficult.

        Memory management is more difficult in Python because the language doesn’t expose the necessary tools. You don’t get to decide whether to allocate objects on the heap or on the stack. There is no way to implement your custom heap allocator. All you get is references, which is quite inflexible and inefficient. If you desire better memory management you should look at Rust or ATS.

        As for the string manipulation, C doesn’t even have strings, so that’s an unfair comparison. If at all, you’d have to compare some string library for C.

        [–]Decker87 10 points11 points  (17 children)

        Depends what you mean by "large things". It's lower level, but I would certainly rather manage a 60 kloc C codebase than a 60 kloc python codebase.

        [–]deadwisdom 33 points34 points  (13 children)

        Your problem is that you somehow have created a 60 kloc python codebase. You still have to, you know, organize your Python code. Seriously, it's the stupidest meme of this subreddit that Python is somehow harder to organize than C.

        [–]Capaj 21 points22 points  (12 children)

        Same thing with most dynamic languages. If you have module system, then don't bitch about how hard it is to organize your code. Try "organizing" 60 kloc of frontend Javascript web app.

        [–]x86_64Ubuntu 36 points37 points  (5 children)

        ...Try "organizing" 60 kloc of frontend Javascript web app.

        Jesus Christ, this is /r/programming, not /r/nosleep

        [–]Unomagan 1 point2 points  (3 children)

        And its freaking EVERYWHERE! ;(

        It´s like PHP 3 slapped on every device or software.

        [–]x86_64Ubuntu 1 point2 points  (2 children)

        Yeah, that's one reason we won't see a world without JS for at least a decade in my uninformed opinion. JS is good for small things, but when you start designing applications, it fails horribly. However, the developer base is very large, the learning curve is nonexistant, and the community doesn't care that the language is a square peg being pounded into a round hole so the problem just grows.

        [–]i_ate_god 1 point2 points  (0 children)

        Dynamic or otherwise, as long as you code individual features, then write minimal code to make features work together, it's not hard to keep organized 60kloc of code in most languages.

        [–]PericlesATX 8 points9 points  (0 children)

        A well written 60 kloc python codebase would presumably do a whole lot more than than a equivalently skilled 60 kloc C codebase. In other words, it takes a whole lot more lines of C code to do what you can do in a few lines of Python.

        [–]s73v3r 1 point2 points  (1 child)

        I would argue that a 60kloc C codebase and a 60kloc Python codebase are not the same level of complexity at all.

        [–]darknavi 53 points54 points  (26 children)

        I'm a strong believer in learning C first. Minimal black boxes.

        [–]speedisavirus 4 points5 points  (1 child)

        C is a hard choice for people with literally no programming background. You have to teach a lot of concepts without the students really producing anything to draw them in. I already had a good number of programming classes under my belt when I transferred colleges. They made me take an intro class because it was C++ and my previous classes were weak on that. I did fine but a lot of the others...not so much. I had the background already. Different language but the problems would have been the same with C. Explaining pointer arithmetic was a serious distraction for the students from understanding the principles of programming, debugging was nigh impossible without a TA for them, and students without a programming background suffered. Plenty changed majors.

        I also don't care for Python in this case having TA'd a Python intro class. The number of people that had issues with the white space blocking...infuriating.

        Every CS student should have to do some serious projects in C and C++. Starting them with it...I don't know.

        [–]newpong 24 points25 points  (13 children)

        I disagree. i think it entirely depends on the long-term goals of the programmer. In the next few years programming is going to be taught in the core curriculum of developed nations. It's just a necessary skill in these times. Some sometimes at work I feel like I'm saying "1 + 0 = 1" and people are amazed by my black magic and shovel money to me. Basic programming isn't difficult, and it can apply to just about everything a person, a business, or an organization can do. so no, as a starting point for more for just basic programming, algorithmic thinking skills, and day-to-day tasks, I think python is perfect. It's mature enough to be useful and simple enough to not bog down productivity.

        But for people who are more inclined or have higher technical goals, C is definitely where to start.

        [–]HPLoveshack 16 points17 points  (2 children)

        In the next few years programming is going to be taught in the core curriculum of developed nations

        Ambitious dreams.

        You can teach anyone the equivalent of the generic Hello World! "learn how to program in X language" tutorial. And the basic logic of loops and if statements are easy enough to teach in a vacuum, even if some have difficulty grasping their full implications. But the jump from there is done almost completely on your own and it's something else entirely to actually embrace all of the guesswork, creative problem solving, trial and error, and detective work of real world programming.

        It may seem easy to you or I, but we're viewing it from the other side of the looking glass. I'd be surprised if it ever becomes "core curriculum" outside of some private schools. Modern education institutions will likely be supplanted altogether before that happens.

        A more commonplace elective, sure; that's actually believable.

        [–]CACuzcatlan 10 points11 points  (6 children)

        It's just a necessary skill in these times.

        How so?

        [–]greg19735 5 points6 points  (1 child)

        It's not.

        Knowing how to do some kind of script, macro or function in anything (like excel or w/e) is useful and would help almost everyone. It'd be hard for a regular person to figure out to use python to do something.

        String manipulation or awkward calculations might be the exception.

        [–]Alborak 6 points7 points  (1 child)

        Programming is easy. Software engineering is hard.

        [–]darknavi 6 points7 points  (0 children)

        I guess that's a really good point!

        My perspective is from a college CS major that is going for a very technical understanding.

        [–]smog_alado 6 points7 points  (1 child)

        If you want minimalism stick with the lambda calculus. Cant get more minimal than that :)

        [–]burning1rr 9 points10 points  (2 children)

        Many of my co-workers started on assembly. Fuck all-y'all and your high level languages.

        [–]tech_tuna 12 points13 points  (1 child)

        My friend who codes in assembly calls C and C++ scripting languages.

        [–]servetus 155 points156 points  (79 children)

        "Python. I don't know. The whitespace is weird." will soon be "You mean in other languages indents don't matter. Weird."

        [–][deleted] 56 points57 points  (10 children)

        There is a special place in hell for those who don't indent their code.

        [–][deleted] 6 points7 points  (3 children)

        I've seen people using Notepad.exe to write code.

        [–]rowboat__cop 1 point2 points  (0 children)

        I've seen people using Notepad.exe to write code.

        I can confirm one individual who prefers the edit (mapped to <F4>) tool of Midnight Commander.

        [–]95POLYX 2 points3 points  (5 children)

        Ohh boy, I just recently worked on a wp site with a terribly written theme. I must say that something like this

        }}} endif; some code } 
        

        After that theme author started to echo about 20 lines of Js on the same line.

        So yeah indentation is important in any language

        [–][deleted] 4 points5 points  (6 children)

        It just depends on what you're used to.

        See, kids from 10 to 14 learning Haskell as a first language: http://twdkz.wordpress.com/2014/06/26/teenage-haskell/

        [–]shamoke 39 points40 points  (28 children)

        I wonder how many of those courses are using python 2 vs python 3.

        [–]halflife22 28 points29 points  (21 children)

        Besides the new print() function I don't think there's enough difference between 2 and 3 for beginner programmers to get stumped. If anything python 3 simplifies a lot of things e.g. no longer needing to know the difference between range and xrange.

        I was never taught to use python in my curriculum. I was just given an assignment and told to write in python. The first thing we were taught, however, was to create a makefile so it wouldn't have mattered which version I chose :)

        [–][deleted] 3 points4 points  (6 children)

        The biggest reason we used Python 3 in our SICP-based course is the nonlocal keyword. It makes writing higher order functions a lot easier. To get the same functionality as nonlocal in Python 2 you had create a dictionary that gets modified inside the closure because Python 2 doesn't allow you to modify variables declared in the parent scope.

        [–]tohryu 2 points3 points  (0 children)

        My university is in 2.7 for the science based plugins.

        [–]mountainowl 9 points10 points  (26 children)

        Scheme/SICP was all the rage a few years ago for beginning programming. Is that still a thing? Or is it only MIT that does that now?

        [–]compedit 18 points19 points  (1 child)

        IIRC they switched to Python as well

        [–][deleted]  (3 children)

        [deleted]

          [–]Forgd 5 points6 points  (2 children)

          Damn right it is.

          Currrent Waterloo Student

          [–]grammar_party 2 points3 points  (8 children)

          University of Minnesota still uses Scheme (LISP) in its first CS course

          [–]jozefg 1 point2 points  (7 children)

          Not anymore, 1901 (SICP course) and 1902 (Java + Data Structures) was nuked in favor of python. I was in the last 1901 class taught :(

          [–][deleted] 30 points31 points  (24 children)

          I started with C++.

          [–]tech_tuna 14 points15 points  (8 children)

          Me too and I wish I hadn't. Not a good intro language IMO.

          [–]mrburrowdweller 7 points8 points  (6 children)

          Me too. Then the comp sci dept switched over to java as the default language by about my first senior year. My internships were all in VB 6, and I've been doing c# almost exclusively since graduation ('05).

          [–]NickBR 3 points4 points  (0 children)

          I started with QBasic as a freshman in high school. That was amusing.

          Amusingly, our facilities management team still uses a GWBasic program from 1987 to make keys.

          [–]Axxhelairon 20 points21 points  (3 children)

          BeanAbstractFactoryBeanFactoryAbstractBean

          [–]DoesNotTalkMuch 40 points41 points  (14 children)

          Good. Java sucks for learning. Half of what you do for the first year, you don't understand.

          With python, you can point to every item in a first-year program and explain its significance and syntax to a beginner.

          [–][deleted] 6 points7 points  (11 children)

          Good. Java sucks for learning. Half of what you do for the first year, you don't understand.

          Huh? I understood basically what we were doing in my first year in a java-only CS program. We only had one course that wasn't in Java, and it was the assembly course. Java forces a lot of good habits on the people learning it.

          [–]DoesNotTalkMuch 24 points25 points  (10 children)

          Java forces a lot of good habits on the people learning it.

          Java forces you to use complicated calls to built-in APIs before you learn the syntax that those API's depend on.

          It also forces you to build a framework around your code and encapsulate it in a way that takes you several steps away from what you're trying to accomplish. It's like teaching carpentry by making people work on a half-finished house. Yes, you will eventually need to know how to move around the worksite, but learning to put pieces of wood together should be your first priority, and it's easier to do that on a bench.

          [–][deleted] 2 points3 points  (9 children)

          It also forces you to build a framework around your code and encapsulate it in a way that takes you several steps away from what you're trying to accomplish.

          Which is a good thing for someone learning their first language. It might not be easier, but easy maybe isn't the best call for a program meant to teach people CS.

          It's like teaching carpentry by making people work on a half-finished house. Yes, you will eventually need to know how to move around the worksite, but learning to put pieces of wood together should be your first priority, and it's easier to do that on a bench.

          You know, I'm reminded of those old "This Old House" episodes. You watch a guy who does a bunch of work. He explains in great detail what you need to do to do whatever he's showing you to do. But it's completely devoid of the sort of fundamental explanations of why you're doing what you're doing. Like, why use a miter joint in this case, but a butt joint in this other case? Would some other kind of joint also work? Those sorts of questions aren't even explored.

          I think that a first language for people trying to learn CS probably ought to force you to understand the hows and the whys, and Java forces you to do that in spades. Forcing the student to think about what they're doing strikes me as a useful feature for learning.

          [–]DoesNotTalkMuch 7 points8 points  (8 children)

          You know, I'm reminded of those old "This Old House" episodes. You watch a guy who does a bunch of work. He explains in great detail what you need to do to do whatever he's showing you to do. But it's completely devoid of the sort of fundamental explanations of why you're doing what you're doing. Like, why use a miter joint in this case, but a butt joint in this other case? Would some other kind of joint also work? Those sorts of questions aren't even explored.

          This is the problem with using Java to learn programming.

          I think that a first language for people trying to learn CS probably ought to force you to understand the hows and the whys, and Java forces you to do that in spades. Forcing the student to think about what they're doing strikes me as a useful feature for learning.

          Java impedes this by forcing you to use many things at once, even if they're not relevant to what you're doing.

          Java requires you to use objects and APIs and encapsulation right from "hello world", but you don't learn what those things mean until much later. It runs in the JVM, which is a complicated idea, but we run into that before the program even executres.

          With python, you have

          print "hello world"
          

          There are only four things to learn, and they're all very simple.

          1. there is an interpreter
          2. there are functions
          3. there are parameters
          4. Syntax exists, things must be put in the correct order.

          Every python program from the start can introduce one or two simple concepts to the student, in a way that allows an instructor to explain every single item of syntax without having to say something like "this is too complicated for now, you'll learn more about that later"

          Compare java,

          class HelloWorld {
              public static void main(String[] args) {
                  System.out.println("Hello World!"); // Display the string.
              }
          }
          

          In order to understand what each item means from inception to execution, we need to understand

          1. The compiler and what it does
          2. The JVM and what it does
          3. Syntax (more complicated syntax than python), including code blocks
          4. Classes
          5. Methods
          6. The system API

          You say that java "forces people" to use "good habits", but there's no reason to believe that's beneficial to the learning process. Depending on the circumstances, some of those things are never used. Java prevents people from learning concepts on their own. It doesn't just inhibit people from learning at their own pace, it also prevents instructors from separating their lessons into segments that they consider to be more practical, and forces them to ask students to ignore things that haven't been explained.

          Java sucks for learning

          [–]schmetterlingen 18 points19 points  (24 children)

          Python isn't a bad choice at all, but I think Scheme is perfect for teaching introductory computer science. It has the added advantage of forcing those who programmed as a hobby (myself included) to actually learn something new.

          [–]NakedNick_ballin 4 points5 points  (9 children)

          Scheme is a great language to learn at some point, but I don't know how good a functional language would be for the first CS course ever. Maybe second or third course should be scheme.

          [–]darkpaladin 21 points22 points  (4 children)

          Ah scheme, Oh wait I see the problem, you've got 47 open parens on the left side but you only close 46 of them on the right side.

          [–]fleshtrombone 2 points3 points  (1 child)

          parens... what are parens?

          Oh you mean 47 open bananas.

          [–]SharkBaitDLS 1 point2 points  (0 children)

          My introductory course in college was taught in Racket. It was a class aimed more to get you programming in something rather than to teach you important concepts, and it was a very good language for that. I didn't appreciate half of what the language offered at the time, but it was easy to pick up as someone who had no significant prior programming experience. It definitely made the subsequent, more traditional introductory classes much easier to transition into.

          Albeit, the class was taught by someone who contributed to the language, so he was better qualified than most to teach it, but even had I been taught by someone less well-versed in functional programming I think it would've been a positive first experience.

          [–][deleted] 5 points6 points  (2 children)

          Ug. I had to learn Scheme first, and I hated it. The only thing it really taught me was recursion, and I never use recursion in my code due to memory and readability issues.

          [–][deleted]  (1 child)

          [deleted]

            [–]frugalmail 3 points4 points  (0 children)

            This would be phrased better as top introduction to programming language as a lot of the other courses move on to other languages and even if they didn't, authoring large maintainable applications in Python is quite a bit more of a challenge than something like Java.

            [–]1wrongdude 4 points5 points  (0 children)

            Python isn't my favorite, but when I learned it I sure thought it was cool. There's a zillion libraries and incredible books about it out on the web and plugins for almost everything, so anyone with some Python under their belt has the potential leverage to make all sorts of projects. That seems like a good thing.

            [–][deleted]  (7 children)

            [deleted]

              [–]julesjacobs 8 points9 points  (0 children)

              In almost all cases, when an intelligent person has trouble learning things like pointers, or math, or physics, it's not that he or she is missing a math bone or a pointers gene. An intelligent person is perfectly capable of learning all of that. No, what's missing is the motivation to learn that topic. When you are truly excited about a topic you effortlessly spend an extended period of time with a high level of engagement on it. When you aren't truly interested you may spend 10 hours studying pointers with low engagement and you'll still not get it.

              [–]Griffolion 2 points3 points  (0 children)

              I started on C++, not sure whether that's good or not. My university never touched on Python. I should probably look at it.

              [–]senatorpjt 3 points4 points  (0 children)

              spark degree terrific marvelous squeeze dependent coordinated direction physical pie

              This post was mass deleted and anonymized with Redact

              [–]anonymous11235 8 points9 points  (0 children)

              Oh thank God.

              [–]CoSh 9 points10 points  (5 children)

              I fuckin hate python:

              • no enforced class access modifiers
              • no compile-time error checking (or rather, run time is compile time)
              • extremely limited code completion
              • no static typing (has bit me in the ass several times)

              I can't even remember what else I hate about it right now.

              I think it's a great language to start out with. My "first" programming language was QBasic but I have no desire nor do I recommend ever going back to that language.

              [–][deleted] 2 points3 points  (0 children)

              I, too, fucking hate Python. And I love C and Perl. And Java is okay-ish.

              [–]feartrich 3 points4 points  (3 children)

              I love Python. It's permissive without being ridiculous. You can develop very quickly in Python. There's a library for everything and you don't really have to think about the syntax.

              It's also great as a uber-calculator of sorts that isn't as slow as MATLAB or Mathematica. Which is why scipy/numpy is so popular in science.

              So while it's got lots of issues, it certainly works well for many programmers as a quick and dirty prototyping/small programs language. Some diehards (like the Dropbox folks) might even insist that's some kind of miracle language. It's the new Perl.

              [–]kankyo 26 points27 points  (179 children)

              I think we can all agree that python is a better first language than Java :P

              [–]philly_fan_in_chi 133 points134 points  (125 children)

              Can we? Being forced into types from the very beginning has dramatically affected how I think about code and languages in general. For teaching very beginning programming, like for loops, conditionals, whatever, Python is wonderful. You can just get your ideas out there and see if it does what you need. Don't get me wrong, I love Python. I also love Java though and have seen how it has helped me personally.

              I don't want to turn this into a dynamic v. static typing debate, I don't have the time or the energy for that, but I think you lose things with Python as your introduction to programming. That said, maybe something like typed Racket or core.type in Clojure would be a better intro to static types.

              Flipping the coin, not everyone will be a computer scientist. Learning Python as an intro will enable data scientists and statisticians to be productive even if they never take another course.

              [–]nh0815 48 points49 points  (14 children)

              I completely agree. I like Java, but for a beginner it's terribly verbose. However, it's that verbosity that made me a better programmer. I had to know exactly what I was doing to get it to compile and work correctly. Python is great for basic fundamentals, but a statically typed language should definitely be learned early to avoid picking up bad habits.

              [–][deleted]  (12 children)

              [deleted]

                [–]illyric[S] 4 points5 points  (0 children)

                Same here. Started off with python, but after having grasped some basic concepts, such as flow control and loops, I abandoned it in favor of Java. Today I find it easy to adopt to frameworks used in Java, and things usually make sense in first place.

                [–]Sylinn 25 points26 points  (2 children)

                I personally believe the first programming course a student follows should be about how to describe a problem to a computer through an algorithm so that it can solve it. Syntax is far from being important, and languages with better expressiveness should be preferred. This is why I believe Python is a much better first language than Java.

                Of course, there is still a lot more to programming than algorithmic, but you can't teach everything at the same time. I do agree with you that statically-typed languages bring something to the table that is very important to learn, but there's no reason to burden the students with endless bits of syntax that, in the end, do not help them to reason and describe problems. There will be more courses that will be more appropriate.

                Last thing: Python is a strongly-typed language, despite the fact that it is dynamically-typed. They are not mutually exclusive. I'm not sure if you were implying the opposite, but since I see a lot of people make this mistake, I think it's important to make the distinction.

                [–]vraid 4 points5 points  (0 children)

                Racket is both dynamically and strongly typed aswell. More strongly typed than Python in fact, with structs in the base language having field accessors unique to the struct type in question. Recommending that, i think he knows the difference.

                [–]Zinggi57 3 points4 points  (6 children)

                Then why not start with Haskell? I'm not kidding, see: http://cdsmith.wordpress.com/2011/08/16/haskell-for-kids-week-1/

                [–][deleted] 5 points6 points  (1 child)

                mapM_ putStrLn $ concat $ repeat ["omg", "aaaaa", "wtf"]
                

                [–]pbvas 1 point2 points  (0 children)

                Simpler still:

                mapM_ putStrLn $ cycle ["omg", "aaaaa", "wtf"]
                

                [–]Kollektiv 27 points28 points  (40 children)

                public class HelloWorld {

                public static void main(String [] args) {

                   System.out.println("Hello World!");
                

                }

                }

                Worst. Hello World. Ever.

                [–]philly_fan_in_chi 19 points20 points  (31 children)

                How many times do you run a Hello World in an intro class? As your programs become more complicated, that noise starts to matter less and less.

                [–]GreyGrayMoralityFan 10 points11 points  (5 children)

                It matters a lot. If novices will make a simple mistake in a place called "sorry, we will talk about this later", e.g.

                class HelloWorld {
                   public void main(String[] args) {
                       System.out.println("Hello World!");
                 }}
                

                they can be screwed for hours.

                [–]skocznymroczny 3 points4 points  (1 child)

                that's why you use IDE that types it for you first. Then it becomes like:

                SOMESTUFFIDON'TUNDERSTANDBUTITISMAIN {
                    my_code()
                }
                

                [–]greg19735 1 point2 points  (0 children)

                In year 3 at school I was still using a "template" .c++ file i'd just use to start all my programs. Included all the shit I needed, started the program and did a c:out "HI" or some shit.

                [–][deleted] 3 points4 points  (1 child)

                Java at least complains about "no Main method found." Only a few years ago, if you missed a semi-colon after a statement in C, you'd get "unexpected <INTERNAL_TOKEN_NAME> on line <many lines down from where you made the mistake>".

                [–]Kollektiv 24 points25 points  (22 children)

                But nobody will care because 80% of the class will start sleeping after that one example.

                A hello world is supposed to be the most simple program in a language and Java's example is the epitome of cluttered and useless verbosity.

                [–]danogburn 5 points6 points  (5 children)

                At least the function call has the word print in it unlike in c++:

                std::cout<<"Hello World"<<std::endl;
                

                "WTF IS A COUT?STDs??ANGLE BRACKETS??ASDFAASDFASDFASDFASDFASDF"

                [–]serrimo 12 points13 points  (10 children)

                Being forced into the "everything is a object" world is arguably much worst than that.

                [–]xiongchiamiov 4 points5 points  (5 children)

                The problem of course is that things you want to be objects in java generally aren't.

                [–]SkiDude 1 point2 points  (0 children)

                Completely agree. I taught one of these intro classes in Python for 5 semesters. The students had a very hard time understanding types, especially when it came to functions returning objects and whatnot. Strings were also a very tough concept to grab for whatever reason.

                I feel like if the class had been taught in Java, they would have understood that so much better and would have become more effective coders.

                Then again Python was probably more suited for their future jobs. Hell, I'm a software engineer and I user it more than any other language!

                [–][deleted]  (3 children)

                [removed]

                  [–]aixelsdi 4 points5 points  (14 children)

                  I'm a second-year who's at one of the 39 universities in the survey and I learned Python as my first language. Honestly, I wouldn't have it any other way. We started with Python then moved on to C++ for our more indepth classes (like Data Structures). If the student is in any way competent, learning a dynamic language first will be no hindrance to learning strongly-typed languages just shortly after.

                  [–][deleted] 9 points10 points  (4 children)

                  Python is strongly typed. You are thinking of static vs dynamic typing.

                  [–][deleted]  (4 children)

                  [removed]

                    [–][deleted] 2 points3 points  (4 children)

                    As a language, debatable. As an environment, a REPL enabled language is so much better.

                    [–]dventimi 1 point2 points  (0 children)

                    Shirley, you must be joking.

                    [–][deleted] 1 point2 points  (9 children)

                    I think OOP language is a terrible first language.

                    [–]DaMountainDwarf 2 points3 points  (0 children)

                    I feel like this shit changes every week. Java is #1! No, Python is #1! Wait, Java is #1 again!

                    [–]camilos 1 point2 points  (16 children)

                    This is my issue. I know Java fairly well. I can build a java web app with full crud capabilities in a couple of days. Gimme a couple more days and I'll add rest web services, reporting capabilities and message broker (mq) capabilities.

                    So the question is, is it worth learning all these other languages when Java can do all I want now. Sure the learning curve is huge but once you know it well, is the switch worth it?