ID:2129414
 
Does having to constantly refer to documentation make you a bad programmer? Further more, what actually determines if you're a good or bad programmer?

I'm curious as to what other people think on the subject. Especially people like Ter13.

My child should be born later tonight / tomorrow morning and I'm not going to have as much time as I used to. Regardless, I'll still be following my dream although progress will be a bit more slow until things settle down.

I'm one of those people who doesn't like to say he's a good programmer, because to be frank I don't believe I am. The expectations I have for myself are extremely high. So high I feel as if I'll never truly reach the expectations I have set for myself.

Do I have to be an extremely good mathematician and be competent at writing low-level code? Do I need to be working with direct x / opengl rather than a higher level graphics layer?

Do I need to be able to memorize the standard windows api for the most commonly used programming languages? C, C++, C#, etc.

What about Web Dev? JavaScript, PHP, NodeJS, SQL, Etc?

Must I have a mastery of everything? As it stands I mostly work high level via frameworks / other engines outside of BYOND. I don't know them inside and out, and I am always looking up documentation. I tend to lean towards making use of high level api so I can produce content much quicker.

I lean towards C# over C++ because it's simply easier and much faster prototyping a functional product.

TLDR; I want to be considered a competent programmer and I want to know what a competent programmer looks like.

BYOND is a terrible place to compare my competence. I do not judge my competence as a programmer based on the ability to program in DM.
Good programmers get paid (good money for good work), I suppose. Capitalism makes it easy to define things like that!

Documentation exists to be seen. It's nearly impossible to just start working with someone else's code -- especially if you don't actually have access to the source -- if you can't refer to documentation for everything you use that code for. If you're ever guessing about something, you should look it up; otherwise you risk human error. Fortunately, code editors like Visual Studio and Eclipse provide tooltips every time you start to type anything.

I'd say a competent programmer should have experience in the things that they're working with, or the ability to reason about new things using prior knowledge. You don't need to know everything, and unless it's part of the job requirements, you're not expected to know everything. A scientific brain is very much required.

Math is the language of science, so it usually helps, but it still depends on the job, how much you need it.

I'm 22 and I've never had a job, so this is my naive opinion. (Going by my first point, you could say that I'm not a good programmer!)
Regardless of experience level, documentation is still a valuable tool. Heck, I've programmed over a decade and I still use references if I need to look up something. Especially, if I need to look up a function I rarely or never used before.

Documentation is also vital in cases of any changes that can occur with function usage. This is especially a case for programming languages like C++. Some of the standard library functions have changed in terms of usage due to updated standards.
Does having to constantly refer to documentation make you a bad programmer?

No. It makes you a careful programmer. I probably perform a quick reference search about once an hour in DM. For languages I'm skilled in, but less so than DM? C++, probably once every 5-10 minutes. Java? Every 20 minutes or so. Python? Every half hour. Javascript? Eh... Maybe once every few hours.

Do I have to be an extremely good mathematician and be competent at writing low-level code?

No. Strong math backgrounds can help and they can hurt. Sometimes having a lot of skills and knowing complex solutions to problems can mask the easy solutions. It can also teach you bad ideas that don't really apply in programming. But that said, the better your math skills, really the better off you will be.

standard windows api

Ahahaha... Hah... Windows. Standard. API. You are funny.

What about Web Dev? JavaScript, PHP, NodeJS, SQL, Etc?

Eh. It all depends on your goals.

Must I have a mastery of everything?

No.

I want to be considered a competent programmer and I want to know what a competent programmer looks like.

It's nice to be respected, but not necessary. Programming takes quite a bit of mixed studying and application to get good at. The best way to get good at programming is just by trying and usually failing to do something. You learn more from your failures than you do your successes. However, having a strong grasp on the fundamentals of computer science and whatever you are working with is a big asset. How you get there is usually by tackling problems that you want to understand fully.

I'd say I'm fairly competent. Not a god or anything, but knowledgable enough to comfortably work in just about any environment, any language, even if I don't know the language. I've learned enough programming languages that picking up a new one is a breeze. I've become what some call "language agnostic". Does that mean I'm a master of all programming languages? No. It just means I have a set of well established skills that are related to almost anything I'm likely to encounter in the wild. Should that be your goal? No. Don't be a generalist. Pick a job and do it. Don't try to learn everything. Don't try to master. Just pick a task and attempt it.

IMO there's not really such a thing as "a" good programmer. Programmers solve problems. The more knowledge you have, the more equipped you are to solve various problems, but until you tackle the problem, you can't possibly know what you will need to know to solve the problem.

Really, I think the reason I have learned as much as I have in terms of programming is that I'm innately curious and very patient when it comes to figuring out how something works. I want to know the little details that make something functional. I want to know the obscure bits that nobody cares about. I don't need someone to teach it to me. I'm willing to tear it apart and examine it from the outside of the black box until I understand what's inside of it.

I think that's all you really need. Everything else is just shortcutting a lot of struggle. Just be willing to set a goal, tackle the problems that come up, accept failure, learn from it, and improve.
Lavenblade wrote:
Does having to constantly refer to documentation make you a bad programmer? Further more, what actually determines if you're a good or bad programmer?

No. Don't even worry about how frequently or for how long you review documentation. Unless doing so is seriously detrimental to your productivity, don't put any thought into it. Try writing a C or C++ application that uses OpenSSL, then you'll understand. That one will have you spending so much time scratching your head at documentation that you'll start to question your sanity, but it's OK.

Refer to later text for answers to your second question.


My child should be born later tonight / tomorrow morning and I'm not going to have as much time as I used to. Regardless, I'll still be following my dream although progress will be a bit more slow until things settle down.

Congratulations!


I'm one of those people who doesn't like to say he's a good programmer, because to be frank I don't believe I am. The expectations I have for myself are extremely high. So high I feel as if I'll never truly reach the expectations I have set for myself.

And that's OK. As soon as you believe you've accomplished as much as you can, or as soon as you stop setting higher expectations for yourself, you've failed. There's always more, and you can always be better.


Do I have to be an extremely good mathematician and be competent at writing low-level code? Do I need to be working with direct x / opengl rather than a higher level graphics layer?

If that's the kind of programming you want to do, then sure. There are people that make a good living off of strictly higher-level programming, and those that make their living off of lower-level programming. There's people that specialize in graphics programming with these APIs, but there's also professionals that may never ever have to deal with these things.

This is a broad spectrum to look at, so there's not really any one true answer for this. Specialize in what you want to do, but never stop learning.


Do I need to be able to memorize the standard windows api for the most commonly used programming languages? C, C++, C#, etc.

Don't bother. For one, the Win32 API is only loosely considered 'standard,' and you definitely won't encounter the same type of stuff in C or C++ that you will in C# -- especially where GUIs are concerned.


What about Web Dev? JavaScript, PHP, NodeJS, SQL, Etc?

If that's what you want to do. I'm a web developer by trade, and I can honestly say that you don't need to know all of these. PHP/JavaScript is a helpful combo, and SQL is also helpful. Unfortunately, SQL's a pain because SQL flavor also varies based on the DB software you choose.


Must I have a mastery of everything? As it stands I mostly work high level via frameworks / other engines outside of BYOND. I don't know them inside and out, and I am always looking up documentation. I tend to lean towards making use of high level api so I can produce content much quicker.

Absolutely not - this will yield a good chance of failure. This will surely turn you into a jack of all trades, but master of none. Decide what kind of things you're wanting to do, then learn some things in that area.


I lean towards C# over C++ because it's simply easier and much faster prototyping a functional product.

This will do you well, if you'd like. Throughout my B.S in CS program, I encountered many people that had this exact preference. On the other hand, lower-level languages weren't greatly promoted in our curriculum, so that likely influenced this preference. That's OK.

Ultimately, a 'competent programmer' can take on many flavors. Don't worry about whether you look like one or not, worry about whether you seem incompetent. Here's my loose criteria for deciding that someone is 'not incompetent' (keep in mind that this is always subjective):

1.) Does this person consistently get completely lost when referring to documentation?

2.) Does this person regularly fail to develop a functional solution?

3.) Can this person effectively solve most problems they're presented with?

Not necessarily in that order, but these are the things that I personally find important. I generally evaluate a developer on all of them across multiple projects and over a long-ish period of time. Some justifications:

1.) Being able to make sense of the documentation you're presented with is important, because you will have to reference it.

2.) Emphasis on functional, because this is also really important to me. Non-functional can be anywhere from "incredibly buggy" to just plain 'ol "produces the wrong output." This point does not care whether the solution is optimal, as far as algorithms, data structures, and designed patterns are concerned. I don't care if your solution sucks. Is it functional? OK, because I can teach you the other stuff over time.

3.) No emphasis here, but being able to effectively solve most problems is a point that somewhat ties in with #2. I don't care if your solutions are optimal, but I do care that your solutions are effective. Does it bring my server/desktop to its knees, or seriously impact user performance? Then it's not an effective solution.

I think I'll wrap up there, without a conclusion because I'm tired and I'll add some closure tomorrow if I feel like it.
Wow, a lot of detailed replies. I appreciate the insight.


Gratz on the new bebeh

#condoms4life



May Lavitiz Jr become best prodigy programmer.
Thanks Ishuri, BYONDs Savior!
In response to Ter13
Ter13 wrote:
I'd say I'm fairly competent. Not a god or anything

You can't fool me BYOND Jesus.

Congratz Lavenblade.
I THOUGHT BYOND'S SAVIOR WAS FORUM_ACCOUNT?



RIP FORUM ACCOUNT, NEVER FORGET 6/20/2012

http://www.byond.com/ forum/?post=818347&page=9#comment2390544
You have competent programmers...

And then you have magical fucking fairy wizard programmers.

You'll never be a magical fairy wizard programmer.
In response to Doohl
Doohl wrote:
You have competent programmers...

And then you have magical fucking fairy wizard programmers.

You'll never be a magical fairy wizard programmer.

That right there is why I stick to my drag-and-drop.

If I can't drag it and drop it, ain't nobody got time for dat.
Lavenblade wrote:
Does having to constantly refer to documentation make you a bad programmer?

No. A good programmer always keeps references handy. Unless you've worked with a function thousands of times, you probably don't remember its arguments and usage issues well enough to know for sure what you're getting into.

Further more, what actually determines if you're a good or bad programmer?

A good programmer learns from their mistakes. They learn over time, with experience, what design approaches fit certain problems best. They learn good ways to debug their code, and ways to avoid bugs via sanity checks. They learn how to think ahead for the future. They comment a lot.

Do I have to be an extremely good mathematician and be competent at writing low-level code? Do I need to be working with direct x / opengl rather than a higher level graphics layer?

No. Understanding low-level code will help in all aspects of programming, but not a lot of people are good at writing it anymore.

Do I need to be able to memorize the standard windows api for the most commonly used programming languages? C, C++, C#, etc.

If you're working with Windows extensively, understanding a lot of the API can't hurt. Memorization is pointless; you'll always need to look stuff up.

What about Web Dev? JavaScript, PHP, NodeJS, SQL, Etc?

Same deal. You'll want to understand as much as you can about the environment you're working with, but no need to go overboard.

Must I have a mastery of everything? As it stands I mostly work high level via frameworks / other engines outside of BYOND. I don't know them inside and out, and I am always looking up documentation. I tend to lean towards making use of high level api so I can produce content much quicker.

If you ever find a programmer who has a mastery of any language, or any API, bring along a basket of green apples to feed the unicorn (s)he's riding.
In response to Lummox JR
Lummox JR wrote:
They comment a lot.


In response to Doohl
Doohl wrote:
You have competent programmers...

And then you have magical fucking fairy wizard programmers.

You'll never be a magical fairy wizard programmer.

Lummox JR wrote:
They comment a lot.

From the wiki page Doohl posted:
The following code is the fast inverse square root implementation from Quake III Arena, stripped of C preprocessor directives, but including the exact original comment text:
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;

x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

return y;
}


Maybe my favorite comment ever :P
In response to Flick
And that comment was because John Carmack didn't originally write it, even though he's usually attributed it. He was just as boggled by the magic numbers as near everyone else, though nowadays the logic behind our is understood (very obfuscated stuff involving Newton's method, though obfuscated for efficiency rather than opaqueness).