ID:1101389
 
Keywords: dbz, math, naruto, programming
How can we tell if someone is a programmer or not, and I don't mean being able to write a program that accomplishes a task, but having the ability to logically compose/decompose a program? Well, there's no universally standard way, and though everyone have their own methods, others might disagree. I follow the principle that in order to be a competent programmer, developer, software engineer, or what ever have-you, you need to have a math mindset. Before you disagree, let me further clarify.
On the first day of my Computer Science course, the professor conducted a self-knowledge evaluation. Why? The answer is simple: he wanted to see who was capable and who was not. Unfortunately, a lot of people left empty handed and embarrassed—ashamed, as well. The ones that had prior programming experience came in well equipped; they answered the questions without hesitating. The others, well, not so much of a combatant—they struggled. They hesitated. They looked at the problem sets like they were written in gibberish. Some got it, sure, but the ones who didn't clearly were not mathematically inclined and didn't like math in the least. Computer Science just wasn't for them. Here you'll find what I believe to be, a more precise, less abstract, version of my post; I reckon you check it out. The purpose of this post isn't to discourage you, no—in fact, I know quite a few good people who are decent at math(excluding calculus, differential equations, linear algebra, e.t.c) but are good at programming(then again, the aspects that I see in someone that I think constitutes them as a good programmer might be different from yours). You don't have to be a mathematician to be a programmer, though having an adequate aptitude for it will help you. Your thoughts?
I think it's just like any other skill, write programs and eventually you'll get good. It's somewhat similar to art, 3D modelling, driving or riding a bike, you just cannot explain why you should do X to solve problem Y, why this or that.
I believe that most people could be taught programming. I read a lot of the comments in that article, and quite a few educators claimed that there really are students who just don't get it.

I really doubt there is some intrinsic factor where the student's brain just can't figure out programming. It seems more likely that a number of environmental/learned factors are at play:

1. They don't care enough. Just because you want to be a programmer doesn't mean you will enjoy every class. I've taken classes with a subject I was very interested in, but did terribly in the class because I didn't like the teacher or something.

2. They are behind everyone else. While I disagree about the "natural affinity" idea, I agree that programming has a very steep learning curve. If someone really never saw code before, you'd have to start at the beginning with procedural programs in a relatively easy to read language. This is just not possible in a modern school setting, the student would have to seek help on their own.

3. They don't have enough time. Some CS students probably have nothing better to do with their lives. Others might have a job, non-CS classes, other hobbies/interests, and friends (no way!). I've been learning programming as a hobby but I have been doing it since I was ten years old. I always liked math too so perhaps that made it easier, but even so it took me a very long time to become a competent BYOND programmer, which is really the only language I know. Imagine stepping into a CS major and having Java and C++ thrown at you. It takes time to learn this stuff, and teachers can't go at different speeds for everybody in the class.

4. They are not being taught the fundamentals, and are not taught in a way that gives them the opportunity to think for themselves. This is how I felt in every math class I ever took. Teachers put up an equation and show you the method to solving it. Not the reasoning, but the method. This is how you arrive at an answer. It's quick and dirty, and allows students to get correct answers. But they often didn't know why their answers were correct.

Then, I had this amazing physics teacher. He was different. He never gave you the answer. Or, if he did give you the answer, that was only the beginning of trying to get you, the student, to explain WHY that was the answer. If you asked him a question, he would often ask a slightly different question back to you. It was infuriating for many students. They just wanted the answer.

It sounds like the students described in the article, who belong in the struggling bell curve, need to be taught about what a "consistent mental model" is and why it relates to programming, and they need to be pushed very hard toward the ability to reason through problems on their own, which is often missed in education and is probably a huge divider in various fields.
Nice tags.

Pretty much what I've found is, being experienced in mathematics can be a primer to allow you to pick up programming easier. Good is a relative term here. In industry, I've not really seen a correlation between mathematical ability and programming ability.

At one company we had the CEO being a Cambridge mathematics graduate and core developer of our framework. Very good at mathematics, pretty good at programming. The lead developer however was mathematically competent (could do various coordinate system projections if you put some paper in front of him to use), but not exactly what one would call 'good' in the industrial sense. The lead developer was the lead developer because his programming was generally better than the CEO, his knowledge of technologies and best practices was better. Which is not to say that conversely, the CEO wrote sloppy code, he wrote some of the best code in the company and would be a valuable addition to any team.

But if you had to pick out of the two, for who you'd bring onto your team, it'd be the lead developer, hands down. The field of business was air traffic systems and simulations, so reasonably based in mathematics as far as software companies go.

You won't find a good programmer that's utterly incompetent at basic calculus. But I suspect that's a general competence thing more-so than obvious correlation. If you're hot at mathematics, you probably find it easier to be at least okay at programming, and vice versa applies. It probably also applies to programming -> physics mind.

It's not that being good at mathematics makes programming as a craft easier for you, it's that it makes picking up programming concepts easier. This is no better seen than in 'Programming for Engineers' courses. They tend to be able to write working code pretty quick. Is it any good? Nah. Works though.

The reason is simple, it's a craft. You aren't born a programmer particularly, you are made one, through practice. Good grasp of mathematics (or physics, or electronics) just reduces the initial learning hump.
The short article you linked to claimed that there was very little difference if any between the results of the original test and the results of the same test given after the course finished. I find it hard to believe that these results would be consistent. Six years ago I probably would have been the person to leave the answers blank. It took awhile, but I was able to train myself into having a "programmers mind". It certainly didn't come naturally, even though I am naturally good at math itself. As Stephen rightly pointed it, it comes through practice just like any other craft.
In response to Magicsofa
Magicsofa wrote:
3. They don't have enough time. Some CS students probably have nothing better to do with their lives. Others might have a job, non-CS classes, other hobbies/interests, and friends (no way!). I've been learning programming as a hobby but I have been doing it since I was ten years old. I always liked math too so perhaps that made it easier, but even so it took me a very long time to become a competent BYOND programmer, which is really the only language I know. Imagine stepping into a CS major and having Java and C++ thrown at you. It takes time to learn this stuff, and teachers can't go at different speeds for everybody in the class.
What's going to happen? It wouldn't look any different; classes(think datums!) and object-oriented programming will just be fashioned differently, and other topics such as generics, and topics explicitly centered around that language. A programming language is just a tool Computer Scientists use.

Very interesting ..

As Magicsofa said:
Teachers put up an equation and show you the method to solving it. Not the reasoning, but the method. This is how you arrive at an answer.

This was the real problem I was facing when I first started my Software Engineering in uni.. The problem is that people normally tend to use the methods used to solve the problem instead of learning the reasoning behind it - this made my beginning quite hard in the degree.

A programmer, in my opinion, does not necessarily need specific skills, every skill matters to him/her. The way I managed to solve the issue is by reading philosophy books, lots of logic, even life experiences matter..! The psychological aspect, certain maths. It is about making good decisions when it comes to code.. communicating with other programmers within the team.. and so on. Expanded way of thinking.

Although it is arguable, I emphasize the importance of logic, and perhaps it is the main skill that differentiates between good programmers and brilliant ones.
In response to Killua - yugioh
It seems like you are advocating the following:

- You oppose presenting solutions rather than the underlying reasoning/logic.
- You stipulate that there are no particular skills a programmer needs, and that all skills in life assist with programming.
- You emphasize the importance of logic, as a particular skill the programmer needs.

What you're saying isn't sensical to me - Given the obvious contradiction between the second and third arguments. And strikes me as overly generalized and somewhat pointless to state. This is possibly because you haven't actually told us what you're trying to argue in favor of.

Normally, an argument will take the form of a posed hypothesis followed by reasonable arguments. Arguments such as 'making good decisions when it comes to code', or 'communicating with other programmers' is not something I can quantify or adequately use. Am I 50% good at making code decisions?

It feels like you're trying to squeeze soft values down over the top of a field of study that is very, very logical and scientific in nature. Its a bit like comparing apples and oranges, in that sense.

On the other hand, there are literally thousands of books, University syllabus', thesis, reports, statistics and similar that would argue heavily against what you're saying here. There are in fact basic needed skills, and there are both times where you want to be fed the solution rather than the understanding, and vice versa.

I will concede that in the matter of 'Is someone a very good programmer', that in itself is a vague question and could lead to the assumption that there are no specific things to look at. However, that is precisely because the question is weak.
I suppose that in certain cases you would want a student to memorize something specific. Syntax would be a great example of this - code must be typed in a certain way, which isn't something you want to just work out on your own.

While there are many skills not specific to programming that would help you as a programmer (time management, the ability to keep from getting flustered, writing/reading/communication), I would say programming is a skill of its own. Giving a series of instructions to a computer is a unique skill, no matter how good you are at math and logic you will probably be completely lost if you sit down to program with no instruction at all...
Am I supposed to perpetuate everything I say? What are you even opposing which doesn't make sense? I presume you have not actually read the second and third points clearly, perhaps you have issue understanding 'not necessarily need specific skills' and 'is the main skill', this means: it is independent from particular skills, but logic is important.
Alathon:
a bit like comparing apples and oranges.
//
because you haven't actually told us what you're trying to argue in favor of.
You critique generalisation when you yourself generalise that you have not understood what is written.
However 'I' decide when I post a useful, focused post. No one is forced to read it anyway.

Here is a greater answer to the question: "How can we tell if someone is a programmer or not", which has similar roots for answering: "How to distinguish good logicians from bad ones" :

A good programmer 'will' have these qualities, the same qualities for good logicians,
- to respond to situations very flexibly
- to take advantage of fortuitous circumstances
- to make sense out of ambiguous or contradictory messages
- to recognise the relative importance of different elements of a situation
- to find similarities between situations despite differences which may separate them
- to draw distictions between situations despite similarities which may link them
- to synthesise new concepts by taking old concepts and putting them together in new way
- to come up with ideas which are novel.
**


Now I believe most programmers will agree with these points, which settles your irritating claims about logic. And anyway, the 'fed the solution' you say about universities might represent your university, but not even close to the way they teach in here. I believe this is the reason it comes 3rd worlwide in researching CS.. not going to argue about it. Instead of attacking someone's reply, try to understand the reason behind it, why I have chosen these words.

Magicsofa:
I would say programming is a skill of its own.

I believe what you mentioned in your last paragraph explains what I am saying or trying to say. But I think that the case where programming is a 'unique skill' which is independant from maths and logic, is quite debatable..
Stephen001:
The reason is simple, it's a craft.



** Douglas R. Hofstadter, Godel Escher Bach.
In response to Killua - yugioh
I find it disappointing that you in one post both insult my knowledge of English while misspelling and misusing words in that very sentence, propose that I didn't read your post as well as decide that because people don't HAVE to read your post, it doesn't have to make sense. You're supposed to be a University student - At, as you point out, one of the better departments for Computer Science in England. You're supposed to strive for knowledge, understanding, expressing yourself in a clear and concise manner so that your knowledge can be conveyed and so on.

Perhaps if you were less busy trying to defend yourself and more busy trying to explain your arguments, it wouldn't come across like so. I certainly hope you never defend yourself like you do on BYOND, during an exam. Not to say that this is an exam, here you have as much time as you want to phrase yourself however you want.

Ironically, your list of required skills exemplifies exactly what I mean. What you're listing are basic human skills, the things we expect all people should be able to do. I can't help but say, 'But what does he even mean? Why is he telling me I need to be able to respond to situations in a flexible manner, and what at all does that have to do with programming specifically?'.

I'm forced to say the exact same thing I did before - What are you actually trying to say here. And just as I have to contend with the fact that you've posted something I believe masquerades itself as some quasi-philosophical rant, posting on a forum will entail that if you do something like that, expect to have someone at least tilt their head and go, 'Wait, what?'. Yes, I'm not being real nice about it. I'm not coating my response in praise, or positives meant to make you feel less defensive. But I'm also not being rude - just honest.

Now you can either flame me like you did in your last post, and postulate that I must be misunderstanding, I didn't read your post, can I even speak English? Or you can consider the possibility that you've just been given a golden opportunity to learn something out of a situation, coming away with more knowledge than you had going into it. And isn't that awesome?
In response to Alathon

Or perhaps Athalon you should be less busy lecturing and attacking others from beginning, and have a straightforward reply to the topic instead of spoiling it arguing about details, and my and your English.

The wonderful points I have quoted from GEB are strongly related to the issue here, and no, these basic human skills do matter greatly my friend. I would ask you politely to read more from the reference if you are still not convinced, and if you wish for details.

Moreover Athalon accept my apologise if you feel this or previous post is/are 'flaming on you', and for what you confidentially believe 'you have as much time as you want'.
The day when you're a programmer is the day when you don't have to ask that question, you just know. It's like asking how to know when someone is a builder. They get asked by someone "What do you do for a living?" and for a while they say "I'm training to be a builder at the moment actually." then they get asked later by someone else and they say "I'm a builder."

Personally I'm not interested in this existentialist nonsense about how much math you have to know to call yourself a programmer or anything of the such. What I want to know is that when you wake up in the morning, what consumes your day? Whatever that is, that's what you do and when you become learned in said skill meaning to the point you can do a lot with it without much aid then you are officially a portrayer of it.

That's my opinion on the matter.
My concern would be these markers are too general to really hone on the specifics of what makes a good programmer. It's mostly as I said before:

You won't find a good programmer that's utterly incompetent at basic calculus. But I suspect that's a general competence thing more-so than obvious correlation. If you're hot at mathematics, you probably find it easier to be at least okay at programming, and vice versa applies. It probably also applies to programming -> physics mind.

To my mind, that's general competence you are discussing. You could apply that to determining a good (well, competent) watercolour artist as much as you could to a programmer.

Which I suspect is Alathon's point regarding basic skills. The criteria you've presented are so commonly required for decent competence in ... more or less any field, that they don't warrant particular discussion or mention in a specific case. They're given requirements, assumed. You'd have to devise tests for the skills you've listed to determine a great artist, musician, or software developer, as greatness to any practice-oriented field implies innovation and creative output. University selection criteria for illustration courses for instance greatly favour candidates who have a portfolio that have experimented (with some degree of visual success) in bringing together seemingly disparate themes or artistic styles, or like to convey novel perspectives on age old questions or through a novel medium.

I don't generally hold that merely having such faculties of the mind makes is a watermark test of who will be a great programmer any more than I hold that fantastic grasp of mathematics is. There is more to it, and that is the issue professors and recruitment specialists are trying to grapple with, finding what that "more" is.

[As a minor point of interest, could you provide some detailing on 'I believe this is the reason it comes 3rd worldwide in researching CS..'? Surely this isn't the University of Southampton?]
In response to Killua - yugioh
Killua - yugioh wrote:
But I think that the case where programming is a 'unique skill' which is independant from maths and logic, is quite debatable..

What I mean by unique skill, is that there are parts of it that you must be taught regardless of what else you know. This often comes from the way you must interact with already established systems.

In math, you need to learn that a cross means addition and a line means subtraction. These symbols were decided upon by people, and they are arbitrary. A person could think up their own math system, but the symbols and syntax would likely be very different and therefore incommunicable. If they happened to use the same symbols, it would be an accident.

Programming is much the same. You are working with machine code, which would be represented on paper as a series of ones and zeroes. But you are not just feeding binary straight to the computer (like they did in the olden days!). Instead you are using a compiler which translates commands that are readable to humans. Programming languages are created, so you must be taught how to use one.
Indeed, programming would require that of a formal system to be learned and understood, if that is what you mean by unique skill. Why am I stressing on the general criteria above, as Stephen said "They're given requirements, assumed" is that the similarity of Programming and say Chemistry for instance (I will avoid the watercolour art example) is that in both, you will have to (understand) and (work) with a formal system. When working with formal systems, one would try first to understand 'why' would he/she needs to do something, for instance in the formal system of any language in programming, say in BYOND DM, you would figure why you would need a 'list' or why are you dealing with 'client'. In chemistry, you would figure why do we list the elements, why we care about their attributes.. and so on, in Maths and any 'straightforward' formal system. Hofstatdter calls this the 'I-Mode', Intelligent Mode.

If you are operating exclusively in 'M-Mode' (Mechanical Mode) you would not need justification, since M-Mode workers just follow the rules mechanically and happily, never questioning them!

Intelligent tends to distinguish between the system and interpretations. If what makes a programmer good is the skill of 'programming' as in knowing the system, then let us take rest and let programmed computers write the scripts for us - do not they work following the system unconsciously, and never caring about the meaning of it, always producing correct code?

This is a quite interesting discussion, the question in the topic is general, and if we consider a beginner programmer "good at programming", even better than someone with 20 years of programming experience, then we are talking about this.. Intelligence. If we are considering a good programmer to be the experienced person - someone who can produce code and more forms of code, then we are not talking about the I-Mode in formal systems, and then my argument is not concerned - and is simply general and unrelated. I personally think this, good programming is good intelligence.
I like the replies so far, well formulated and directly addresses the topic rather than drifting away from it. The argument can be comparable to that of "do you need perfect spelling or an extraordinary vocabulary to be a good writer?", which some(who wouldn't?) would obviously say yes to the latter. But, it really depends on the task and the job you're doing--if you're a game developer(3D, I guess?), you need an aptitude for math. That certainly is not debatable. The two share a mutual relationship but it is not required to be a 'programmer'. Anyone can say they're a programmer. I never liked math when I was younger, but when I started programming, I started loving math--which leads me back to 'they share a mutual relationship'. We can all just agree that math is a role, but it's not required to be a programmer. Some programming language have vaguely borrowed aspects from math disciplines, such as lambda calculus. Doing business? Your boss obviously won't want you to devise a new algorithm to handle said task, but you do need math to use an existing one to accomplish the job.