views:

3788

answers:

32

I am a hobbyist programmer (started with VBA to make excel quicker) and have been working with VB.NET / C#.NET and am trying to learn ADO.NET. This is my first post and I apologise for the subjective nature of the question.

A facet of programming that has always frustrated me is what does 'good' look like? I am not a professional so have little to compare against. What makes a better programmer? Is it:

  • They have a better understanding of all the objects / classes / methods in a given language?
  • Their programs are more efficient?
  • The design of their programs are much better in terms of better documentation, good choice of names for functions etc.?

Put another way, if I were to look at the code of a professional programmer, what is the first thing that I would notice about their code relative to mine? For example, I read books like 'Professional ASP.NET' by Wrox press. Are the code examples in that book 'world class'? Is that the pinnacle? Would any top-gun programmer look at that code and think it was good code?

+12  A: 

Code is poetry.

Start from this point of logic and you can derive many of the desirable qualities of code. Most importantly, observe that code is read far more than it is written, hence write code for the reader. Rewrite, rename, edit, and refactor for the reader.

A follow on corollary:

The reader will be you at time n from the code creation date. The payoff of writing code for the reader is a monotonically increasing function of n. A reader looking at your code for the first time is indicated by n == infinity.

In other words, the larger the gap of time from when you wrote the code to when you revisit the code, the more you will appreciate your efforts to write for the reader. Also, anyone you hand your code off to will gain great benefit from code written with the reader as the foremost consideration.

A second corollary:

Code written without consideration for the reader can be unnecessarily difficult to understand or use. When the consideration for the reader drops below a certain threshold, the reader derives less value from the code than the value gained by rewriting the code. When this occurs the previous code is thrown away and, tragically, much work is repeated during the rewrite.

A third corollary:

Corollary two has been known to repeat itself multiple times in a vicious cycle of poorly documented code followed by forced rewrites.

Jarred McCaffrey
With the exception that with code, it should be obvious what it you mean, exactly. +1, though
Rik
But, does it rhyme?
Ferruccio
Good code doesn't rhyme but my non-techie girlfriend looked at some PHP code I was working on and said, "that's so ugly." In fact, she was right: it was code that I too considered to be "crap."
Yar
Once saw Richard Gabriel talk about his writing poetry to programmers. Took me a while to make the connection.
Thorbjørn Ravn Andersen
+3  A: 

Good code should be easily understood.
It should be well commented.
Difficult parts should be even better commented.

Burkhard
im not sure you can say 'good code should be easily understood' - some code performs very complex functions, those functions are themselves not easily understood, so it doesn't immediately follow that code you cannot understand is bad code - it could be great code working through a complex concept.
flesh
Would complex, good code be considered clever code?
daub815
+4  A: 

Good code is readable. You'd have no trouble understanding what the code is doing on the first read through of code written by a good professional programmer.

Bill the Lizard
+59  A: 

The first thing you'd notice is that their code follows a consistent coding-style. They always write their structure blocks the same, indent religiously and comment where appropriate.

The second things you'd notice is that their code is segmented into small methods / functions spanning no more than a couple dozen lines at the most. They also use self describing method names and generally their code is very readable.

The third thing you'd notice, after you messed around with the code a little is that the logic is easy to follow, easy to modify - and therefore easily maintainable.

After that, you'll need some knowledge and experience in software design techniques to understand the specific choices they took constructing their code architecture.

Regarding books, I haven't seen many books where the code could be considered "world-class". In books they try mostly to present simple examples, which might be relevant to solving very simple problems but aren't reflective of more complex situations.

Eran Galperin
+1 for summarizing it very effectively. One more thing that can be added is to avoid too many nested branches. Probably two levels is acceptable after that it becomes too difficult to follow.
Naveen
You're right. I thought about adding it but thought it might be too specific
Eran Galperin
Really good summary. About the few lines of code, i think it would be good for beginer informations to say that it's a RESULT of the clean code, not a way to get clean code - don't force yourself to write little functions, you'll do it anyway if your design follow the KISS principle for example.
Klaim
I would not place too high an emphasis on "small functions", either as a goal or as a result. Too many small functions is just as hard to follow as pages of opaque code.
staticsan
While sometimes unavoidable, in general when I look at long methods I think "is this method trying to do much? how about replacing some blocks of logic with meaningfully named methods?"I believe following logic composed of such methods is much easier than trying to digest all the logic at once
Eran Galperin
A: 

Good code is easy to understand, easy to maintain, and easy to add to. Ideally, it is also as efficient as possible without sacrificing other indicators.

Nerdfest
A: 

Great code to me is something that is simple to grasp yet sophisticated. The things that make you go, "wow, of course, why didn't I think of it that way?". Really good code is not hard to understand, it simply solves the problem at hand in a straight-forward way (or a recursive way, if that is even simpler).

HS
+8  A: 

I've been programming for 28 years and I find this a tough question to answer. To me good code is a complete package. The code is cleanly written, with meaningful variable and method names. It has well placed comments that comment the intent of the code and doesn't just regurgitate the code you can already read. The code does what it is supposed to in an efficient manner, without wasting resources. It also has to be written with an eye towards maintainability.

The bottom line though is that it means different things to different people. What I might label as good code someone else might hate. Good code will have some common traits which I think I've identified above.

The best thing you can do is expose yourself to code. Look at other people's code. Open Source projects are a good source for that. You will find good code and bad code. The more you look at it, the better you will recognize what you determine to be good code and bad code.

Ultimately you will be your own judge. When you find styles and techniques you like adopt them, over time you will come up with your own style and that will change over time. There is no person on here that can wave a wand and say what is good and that anything else is bad.

bruceatk
A: 

Good code is where you know what the method does from the name. Bad code is where you have to work out what the code does, to make sense of the name.

Good code is where if you read it, you can understand what it's doing in not much more time than it takes to read it. Bad code is where you end up looking at it for ages trying to work out wtf it does.

Good code has things named in such a way as to make trivial comments unnecessary.

Good code tends to be short.

Good code can be reused to do what it does anywhere else, since it doesn't rely on stuff that is really unrelated to its purpose.

Good code is usually a set of simple tools to do simple jobs (put together in well organised ways to do more sophisticated jobs). Bad code tends to be huge multi-purpose tools that are easy to break and difficult to use.

ChrisA
+31  A: 

The list below is not comprehensive, but these are the things that I thought of in considering your question.

  • Good code is well-organized. Data and operations in classes fit together. There aren't extraneous dependencies between classes. It does not look like "spaghetti."

  • Good code comments explain why things are done not what is done. The code itself explains what is done. The need for comments should be minimal.

  • Good code uses meaningful naming conventions for all but the most transient of objects. the name of something is informative about when and how to use the object.

  • Good code is well-tested. Tests serve as an executable specification of the code and examples of its use.

  • Good code is not "clever". It does things in straightforward, obvious ways.

  • Good code is developed in small, easy to read units of computation. These units are reused throughout the code.

I haven't read it yet, but the book I'm planning to read on this topic is Clean Code by Robert C. Martin.

tvanfosson
Very good points. I particularly like the "good code is not clever" remark. It is tremendously hard to write code that other people find readable and maintainable. Writing "dog's breakfast" code that nobody understands (including yourself after a while) is the easiest thing in the world.
Glytzhkof
+2  A: 

[Purely subjective answer]
For me, good code is a form of art, just like a painting. I might go further and say that it's actually a drawing that includes characters, colors, "form" or "structure" of code, and with all this being so readable/performant. The combination of readability, structure (i.e. columns, indentation, even variable names of the same length!), color (class names, variable names, comments, etc.) all make what I like to see as a "beautiful" picture that can make me either very proud or very detestful of my own code.

(As said before, very subjective answer. Sorry for my English.)

Hosam Aly
+6  A: 

Read the book Code Complete. This explains a lot of ideas about how to structure code and the the reasons for doing so. Reading it should short-circuit your time to aquiring the experience necessary to tell good from bad.

http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1229267173&sr=8-1

Scott Langham
A: 

Code is a reflection of a programmer's skills and mindset. Good programmers always have an eye on the future - how the code will function when requirements or circumstances are not exactly what they are today. How scalabale it will be? How convenient it will be when I am not the one maintaining this code? How reusable the code will be, so that someone else doing similar stuff can reuse the code and not write it again. What when someone else is trying to understand the code that I have written.

When a programmer has that mindset, all the other stuff falls in place nicely.

Note: A code base is worked on by many programmers over time and typically there is not a specific designation of code base to a programmer. Hence good code is a reflection of all the company's standards and quality of their workforce.

Ather
A: 

(I use "he" below because this is the person that I aspire to be, sometimes with success).

I believe that the core of a good programmer's philosophy is that he is always thinking "I am coding for myself in the future when I will have forgotten all about this task, why I was working on it, what were the risks and even how this code was supposed to work."

As such, his code has to:

  1. Work (it doesn't matter how fast code gets to the wrong answer. There's no partial credit in the real world).
  2. Explain how he knows that this code works. This is a combination of documentation (javadoc is my tool of choice), exception handling and test code. In a very real sense, I believe that, line for line, test code is more valuable than functional code if for no other reason than it explains "this code works, this is how it should be used, and this is why I should get paid."
  3. Be maintained. Dead code is a nightmare. Legacy code maintenance is a chore but it has to be done (and remember, it's "legacy" the moment that it leaves your desk).

On the other hand, I believe that the good programmer should never do these things:

  1. Obsess over formatting. There are plenty of IDEs, editors and pretty-printers that can format code to exactly the standard or personal preference that you feel is appropriate. I use Netbeans, I set up the format options once and hit alt-shift-F every now and then. Decide how you want the code to look, set up your environment and let the tool do the grunt work.
  2. Obsess over naming conventions at the expense of human communication. If a naming convention is leading you down the road of naming your classes "IElephantProviderSupportAbstractManagerSupport" rather than "Zookeeper", change the standard before you make it harder for the next person.
  3. Forget that he works as a team with actual human beings.
  4. Forget that the primary source of coding errors is sitting at his keyboard right now. If there's a mistake or an error, he should look to himself first.
  5. Forget that what goes around comes around. Any work that he does now to make his code more accessible to future readers will almost certainly benefit him directly (because who's going to be the first person asked to look at his code? He is).
Bob Cross
You aspire to be male? ;-)
Ken
@Ken, ho ho, your wit has blinded me, sir. Donning wit goggles now: 8-p
Bob Cross
+2  A: 

I second the recommendation of Bob Martin's "Clean Code".

"Beautiful Code" was highly acclaimed a couple of years ago.

Any of McConnell's books are worth reading.

Perhaps "The Pragmatic Programmer" would be helpful, too.

%

duffymo
+12  A: 

Personally, I'll have to quote "The Zen of Python" by Tim Peters. It tells Python programmers what their code should look like, but I find that it applies to basically all code.

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Only problem with "There should be one-- and preferably only one --obvious way to do it." The obvious way depends a lot of the way you think about the problem. That is imperative versus functional.
grom
@grom: Unless you're Dutch
Mike Robinson
+3  A: 

Succinctly put, a good programmer's code can be read and understood.

In my opinion, a good programmer's code is language-agnostic; well-written code can be read and understood in a short amount of time with minimal thinking, regardless of the programming language used. Whether the code is in Java, Python, C++ or Haskell, well-written code is understandable by people who don't even program in that particular language.

Some characteristics of code that is easy to read are, methods that are well-named, absence of "tricks" and convoluted "optimization", classes are well-designed, to name a few. As others have mentioned, coding style is consistent, succinct and straight-forward.

For example, the other day, I was taking a look at the code for TinyMCE to answer one of the questions on Stack Overflow. It is written in JavaScript, a language that I've hardly used. Yet, because of the coding style and the comments that are included, along with the structuring of the code itself, it was fairly understandable, and I was able to navigate through the code in a few minutes.

One book that was quite an eye-opener for me in the regard of reading good programmer's code is Beautiful Code. It has many articles written by authors of various programming projects in various programming languages. Yet, when I read it, I could understand what the author was writing in his code despite the fact that I've never even programmed in that particular language.

Perhaps what we should keep in mind is that programming is also about communication, not only to the computer but to people, so good programmer's code is almost like a well-written book, which can communicate to the reader about the ideas it wants to convey.

coobird
+11  A: 

Quoting Fowler, summizing readability:

Any fool can write code that a computer can understand.
Good programmers write code that humans can understand.

'nough said.

chakrit
A: 

If you write C++ code, there is a very good book with excellent coding standards that we refer to at uni called: "C++ Coding Standards: 101 rules, Guidelines, and Best Practices" by Herb Sutter, Andrei Alexandrescu and Bjarne Stroustrup.

Brock Woolf
+1  A: 

Rather then repeat everyone else's great suggestions, I will instead suggest that you read the book Code Complete by Steve McConnell

Essentially it is a book packed full of programming best practices for both functionality and style.

leaf dev
A: 
  1. It works
  2. It has unit tests that prove that it works

The rest is icing...

Ali A
+1  A: 

Just wanted to add my 2 cents... comments in your code -- and your code itself, generally -- should say what your code does, now how it does it. Once you have the concept of 'client' code, which is code that calls other code (simplest example is code that calls a method), you should always be most worried about making your code comprehensible from the "client's" perspective. As your code grows, you'll see that this is... uh, good.

A lot of the other stuff about good code is about the mental leaps that you'll make (definitely, if you pay attention)... 99% of them have to do with doing a bit more work now to spare you a ton of work later, and reusability. And also with doing things right: I almost always want to run the other way rather than using regular expressions, but every time I get into them, I see why everybody uses them in every single language I work in (they're abstruse, but work and probably couldn't be better).

Regarding whether to look at books, I would say definitely not in my experience. Look at APIs and frameworks and code conventions and other people's code and use your own instincts, and try to understand why stuff is the way it is and what the implications of things are. The thing that code in books almost never does is plan for the unplanned, which is what error checking is all about. This only pays off when somebody sends you an email and says, "I got error 321" instead of "hey, the app is broke, yo."

Good code is written with the future in mind, both from the programmer's perspective and the user's perspective.

Yar
+3  A: 
  • Easy to read
  • easy to write
  • easy to maintain

everything else is filigree

kloucks
"Easy to read" for programmer A and "easy to maintain" for programmer B are 2 contradicting goals, they both can never be achieved. Any coding involves compromise between those 2 depending on business priorities. Writing code that is easy to read for anybody else makes it less maintainable for one who wrote it.
alpav
@alpav: what you say is absolutely true for substandard programmers, NOT for intermediate and expert programmers who know that in a year they will have to maintain their own code of which they have no memory so they want it exactly easy to read and easy to maintain. They CAN be achieved and I've done it repeatedly for 30 years, you are completely wrong.
kloucks
alpav: Can you give an example of how the two are conflicting? They seem perfectly aligned to me: how can you maintain something if you can't read it?
Ken
A: 
  • The best code has a certain elegance that you recognise as soon as you see it.
  • It looks crafted, with care and attention to detail. It's obviously produced with someone with skill and has an art about it - you could say it looks sculpted and polished, rather than rough and ready.
  • It's consistent and reads easily.
  • It's split into small, highly cohesive functions each of which do one thing and do it well.
  • It's minimally coupled, meaning that dependencies are few and strictly controlled, usually by...
  • Functions and classes have dependencies on abstractions rather than implementations.
Mike Scott
+1  A: 

This is answered pretty well in Fowler's book, "Refactoring", It's the absence of all the "smells" he describes throughout the book.

le dorfier
+1  A: 

I haven't seen 'Professional ASP.NET', but I'd be surprised if it's better than OK. See this question for some books with really good code. (It varies, of course, but the accepted answer there is hard to beat.)

Darius Bacon
+1  A: 

This seems to be (should be) a FAQ. There is an ACM article about beautiful code recently. There seems to be a lot of emphasis on easy to read/understand. I'd qualifier this with "easy to read/understand by domain experts". Really good programmers tend to use the best algorithms (instead of naive easy to understand O(n^2) algorithms) for any given problems, which could be hard to follow, if you're not familiar with the algorithm, even if the good programmer gives a reference to the algorithm.

Nobody is perfect including good programmers but their code tend to strive for:

  1. Correctness and efficiency with proven algorithms (instead of naive and adhoc hacks)
  2. Clarity (comment for intent with reference to non-trivial algorithms)
  3. Completeness to cover the basics (coding convention, versioning, documentation, unit tests etc.)
  4. Succinctness (DRY)
  5. Robustness (resilient to arbitrary input and disruption of change requests)
ididak
A: 

Ironically the better the programmer the less indispensable he/she becomes because the code produced is better maintainable by anyone (as stated by general consent by Eran Galperin).

My experience tells the opposite is also true. The worse the programmer the more difficult to maintain his/her code is, so more indispensable he/she becomes, since no other soul can understand the riddles produced.

Fernando Miguélez
+1  A: 

i second the recommendation for uncle bob's "clean code". but you may wish to take a look at http://www.amazon.com/Implementation-Patterns-Addison-Wesley-Signature-Kent/dp/0321413091 as i think this deals with your specific question a bit better. good code should leap off the page and tell you what it does/how it works.

Ray Tayek
+1  A: 

Jeff Atwood wrote a nice article about how coders are Typists first reference: http://www.codinghorror.com/blog/archives/001188.html

When being a typist you always need to be elegant in your work, having strucutre and proper "grammar" is highly important. Now converting this to "programming"-typing would catch the same outcome.

Structure

Comments

Regions

I'm a software engineere which means during my education i've come across many different languages but my programming always "feel" the same, as my writing does on fekberg.wordpress.com, i have a "special" way for typing.

Now programming different applications and in different languages, such as Java, C#, Assembler, C++,C i've come to the "standard" of writing that i like.

I see everything as "boxes" or regions and each region has it's explaining commenting. A region might be "class Person" and inside this Region i have a couple of methods for properties, which i may call "Access Methods" or such and each property and region has it's own explaining commenting.

This is highly important, i always see my code that i do, as "being a part of an api", when creating an API structure and elegance is VERY important.

Think about this. Also read my paper on Communication issues when adapting outsourcing which explains in rough, how bad code can conflict, Enterpret as you like: http://fekberg.wordpress.com/2008/12/14/communication-issues-when-adapting-outsourcing/

Filip Ekberg
+2  A: 

Having been programming for nearly 10 years now myself and having worked with others I can say without bias that there is no difference between a good programmer and an average programmers code

All programmers at a competent level:

  • Comment Correctly
  • Structure Efficiently
  • Document Cleanly

I once overheard a co-worker say "I've always been very logical and rational minded. I think that's why I enjoy developing"

That in my opinion, is the mind of an average programmer. One who sees the world in terms of rules and logic and ultimately obeys those rules when designing and writing a program.

The expert programmer, understands the rules, but also their context. This ultimately leads to them coming up with new ideas and implementations, the mark of an expert programmer. Programming is ultimately an art form.

Jamie Lewis
Not as much an art as a craft.
Thorbjørn Ravn Andersen
A: 

It looks good

ima
A: 

I have a good example :

Read GWT (google web tookit) Source code, you will see that every fool understand it (some english books are harder to read than this code).

Nicolas Dorier