Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I know there are similar questions on here, which I've read, but I recently read this post by Joel Spolsky:

How can I teach a bright person, with no programming experience, how to program?

And it got me thinking about my way of learning and whether it might actually be harmful in the long run.

I've dabbled with various languages but C# is my first serious one, I've read "Head First C#" and created a few projects. But after reading the post above I've found it a bit disheartening that I may be going about it all wrong, obviously I respect Joel's opinion which is what has thrown me a bit.

I've started reading "Code" as recommended in the reading list and I'm finding it pretty hard going, although enjoyable. I feel like it's taken the shine off of my "noobish hacking about" in Visual Studio.

So now I'm unsure as to what path I should take? Should I take a step back and follow Joel's advice and start reading?

I guess my main aim is just to become a good programmer, like everyone else, but I don't want to be going into bad practice by learning a .NET language when someone who's opinion I respect thinks that it is harmful.


Learning CS the hard way can be done, but only if you have a good teacher. –  Job Aug 12 '11 at 0:52
C# wasn't my first language VB.net was and I can tell you it's not how you start that matters. I think C# will be a great starting language just remember to always ask yourself why things are done the way they are. –  Daniel Little Aug 12 '11 at 0:56
No. Any language as a first language is good to learn the theory of computing science. Granted, to make a career of it, some languages are better than others, but for learning purposes, anything is good. Some of the finest programmers I know started with BASIC on a C64, Apple II or TI-99/4A. It didn't rot their brains, but urged them on to the next language and then the next. –  Jesse C. Slicer Aug 12 '11 at 1:08
Also, it depends on what you plan to do with that knowledge. C# solves business problems day in and day out where I work. I haven't looked at C in bordering on 2 decades and I feel icky when I have to. –  Jesse C. Slicer Aug 12 '11 at 1:11
Learning something is never a mistake. It is always much better than not learning. –  SK-logic Aug 12 '11 at 10:38
show 9 more comments

locked by Thomas Owens Nov 29 '13 at 10:42

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

20 Answers

up vote 80 down vote accepted

I've dabbed with various languages but C# is my first serious one, I've read "Head First C#" and created a few projects. But after reading the post above I've found it a bit disheartening that I may be going about it all wrong, obviously I respect Joel's opinion which is what has thrown me a bit.

I respect Joel's opinions too, but they are just that: opinions. There's absolutely nothing wrong with using C# as a starting language.

The biggest advice I can give you, or anyone doing any programming (even if they're starting in vanilla C!) is to not be stagnant, and don't be religious. I don't care what programming language you're starting with, or how pure or righteous that language is - in this day and age you cannot afford to sit in only world of programming.

For example, I started programming with PHP3 back when I was a teenager. I built some small web apps and a few web sites with it; I thought that I was a genius programmer and that I could do anything with PHP3, and frowned on people who were all about ASP or BASIC. Boy, was I wrong.

I didn't start to truly blossom as a developer until I began expanding my horizons and studying other programming languages and concepts. During high school I learned some RealBASIC, and then later Visual Basic. After business school, when I became a professional developer, I started learning C# and Javascript in earnest.

Now, don't misunderstand me here - I'm not advocating that you try to be a Jack of All Trades. At heart, and in trade, I'm still a PHP programmer. PHP is my bread and butter, and I know it inside and out. However, my PHP skills didn't become what they were just doing PHP. Here are some highly important concepts that I didn't grasp from PHP, despite working in it professionaly.

  • Javascript: Closures
  • jQuery (yes, separate): the DOM and Ajax
  • Visual Basic: Objected-oriented programming
  • C#: Generics and closures
  • Ruby (on Rails): The power of MVC design

I could go on, and so could many others on this site as well, for days. Even though I'm a PHP programmer I was able to bring all of these other wonderful concepts back with me into the work I do every day.

What's my point? Learn C#. Become a master of C# - you'll have a long, successful career and you'll probably accomplish some amazing things. But don't pigeon-hole yourself. Journey, and taste other languages and environments and concepts.

+1. In my opinion, you can't truly be a great developer and a master of your main language, without having learned and played around with other languages. That's the best way to expand your knowledge, and to truly appreciate the strong sides of your main language. –  Niklas H Aug 12 '11 at 9:32
+1. The key take away from this are the words he chose to bold. It is too easy to learn something like Java and C#, or even C and spend 10 years of your life writing code the way you always have. Push yourself, learn a new language every year. Question the things you do, try to find a better way. And most important, stay involved on Programmers and StackOverflow. –  Andrew Finnell Aug 12 '11 at 12:43
show 11 more comments

when someone who's opinion I respect thinks that it is harmful.

This reminds me of a story involving Richard Feynman. A student at Caltech asked the eminent cosmologist Michael Turner what his "bias" was in favoring a type of particle as a candidate to comprise the dark matter, and Feynman snapped and said "Why do you want to know his bias? Form your own!...Don't pay attention to authorities, think for yourself."

Programmers come from all walks of life. Java is taught in many high schools and colleges today, yet it hadn't even been invented when Joel Spolsky was in school. There is no "one true path" when it comes to becoming a good programmer. There are certainly some classics like SICP that most programmers stumble across at some point, but there's no hard and fast standard. The main thing is to start somewhere, and focus on building concepts. A great programmer once said something like:

Bad programmers focus on code, good programmers focus on algorithms.

I think C# is a fine language to start with, but I warn you to be wary of Visual Studio. It is a tremendous IDE, but if you drag a DropDownList and bind a GridView to a ObjectDataSource and use a Button control to make a DropDownList based search, then most of the work is done by the IDE and you're not really programming. Take advantage of the IDEs tools, but always try to build concepts and develop knowledge.

First you say "Good programmers focus on Algorithms" then you say "the work is done by the IDE and you're not really programming". Which is it? I can write a program, do the work flow right and not care about "implementation details" like GridView and DropDown (Assuming i know enough to choose the right ones, and how to implement them right). +1 for the rest of the question, but using an IDE doesn't preclude you from being a good programmer. –  WernerCD Aug 12 '11 at 13:41
@Graham - Sorry, but I disagree. He's not trying to learn IT or software development - he's trying to learn programming. IDE tools are, in my view, best left for later after you are actually a competent programmer. –  BlackJack Aug 12 '11 at 14:18
The key is that a good developer doesn't believe in magic. The work done by the IDE (or any other tool) is a convenience, a shortcut, but not a replacement for understanding. –  Bevan Aug 14 '11 at 6:31
show 5 more comments

I'm just a junior, but with all humility and respect for those infinitely more experienced, I have to confess that I don't get this attitude either.

One programmer commented below Joel's answer: "as someone who has had to bang his head on the desk over "programmers" who came highly recommended for their C# abilities, but couldn't do simple things like implement a very well documented base class, find memory leaks in c and c++ programs"...

But why must finding memory leaks in C++ apps be simple for someone who never claimed to know C++? :) I don't understand. It's like criticizing a psychologist for lack of dentist skills. I'm surely not a good programmer, but I feel this is not because I don't know C++ - it's because I don't know well enough the framework and languages which I am using.

"couldn't do simple things like implement a very well documented base class (...) or simply figure out a problem on their own or learn a new idea at even a moderate pace"

OK, but - correlation doesn't mean causation, and what makes us assume that their lack of general programming skills - which I don't doubt - is a result of their language choice?

Or an effect of C# being their first language of choice, for that matter?

I can see other plausible explanations (perhaps C# is just trendy, and hence it attracts a lot of novices... most people for whom C# is the first language have not been programming very long at all, and that is more of a handicap in its own right than never programming in some other language... etc., etc.).

I see your point. I know the very basics of variables' lifetime (just about as much as I may need in C# on a daily basis: scope, using, IDisposable, event handlers referencing their listeners etc.), but I couldn't even seriously attempt to diagnose a memory leak in a C++ application, because I'm not even familiar with the syntax! I don't know what asterisk stands for. –  Konrad Morawski Aug 12 '11 at 14:10
show 1 more comment

I'd say learning one language and sticking with it is more of a mistake than deciding which language you should start with. There are some languages you can learn that are easier of course, but it's better to try and start learning one that you'll be using a lot (in a school setting the language choice is already made by the school). After you've properly learnt a language and used it actively after some months, you should dabble with another programming language and compare.

In .NET it's easy for you to go with two (sort-of) different programming languages since you can switch between Visual Basic and C#. So you can learn Visual Basic and see what the differences are. At this level you should be proficient with basic procedural coding with the three basic programming structures, if you can be creative with them all (and know how to use variables) then you're on your way to become a great programmer:

  • Sequence - Code is written in sequence of steps that follow each other in a manner you specify, (defines a "jump", step-by-step and gotos)
  • Conditional - Code can have decision points, (defines if-statements, switch-case statements)
  • Looping/Repetition - Code can repeat itself given some decision (which is an extension of both above, defines for-, do-while-loops)

It doesn't matter if your secondary programming language will be your most active or not, just knowing that programming languages (specially if they're following the same paradigm) are very similar to each other and there are small nuances actually goes a long way to get you to understand how software programming works.

From that, at least once a year, try to learn a new programming language that follow another programming paradigm. You don't need to completely keep up with the new language but there are some benefits to know other paradigms. There are several paradigms, and some programming languages intermix between many (note that C# actually has subsets the following three):

The most important things you should learn that many programming languages follow their own set of idioms and a basic API. So when you learn a new language, try to learn those idioms and API's well and you'll be fine when you build stuff. One good reason is that you'll become better at designing and solving programming problems. Some idiom in one language, may give you some insight on how to solve a problem in your main one.

Also know that there is also another very good reason why you should learn other programming languages, other than the main language you'll be using the most: Your chances on employment is much greater.

add comment

The focus of your question and many of the answers here is on C#. From Wikipedia:

C# language is intended to be a simple, modern, general-purpose, object-oriented programming language.

Based on that alone, it seems safe to say that you could learn C# as a first language without doing any long-term damage to your brain. I don't think that Joel was condemning the entire language, though, when he wrote:

Attempts to take a shortcut and go directly to learning the exact thing you want to learn right now (like starting with C# and ASP.NET) are doomed.

The problem isn't the language, it's taking shortcuts. Too often, people try to take a quick route to their end goal by following step-by-step tutorials or "learn everything in 24 hours" books. You don't have to spend too much time on Stack Overflow before you start noticing that there are a lot of questions along the lines of: "I've never written a line of code in my life, but I'm getting into iPhone programming! Can someone please give me step-by-step instructions for doing exactly what I want to do? Thanks!" I'm not saying that you're taking that approach, but it's something that you have to guard against.

If you want to develop solid programming skills, you should start by learning fundamental skills. If you try to jump straight to OOP and GUI applications and such, you'll probably miss those fundamentals. The books that Joel pointed to are very good indeed. I've only skimmed through the C# Yellow Book (PDF), but looks like it's probably a better intro to programming than most of the C# books I see in stores.

show 1 more comment

To me, that stuff in that other article smacked a bit of being elitist drivel. Yes, I frequently recommend SICP to serious developers who really want to get better, but only to those who want to go beyond the "norm" and learn the deep magic. Indeed, for years SICP was the standard MIT freshman programming text; but, a lot of solid working programmers never had the opportunity to attend that fine but expensive and highly selective institution.

So what do I recommend, in answer to your question? Start with what you have and learn how to think like a programmer, rather than just learning some specific language.

If you happen to have a C# implementation available, well, I can tell you that it's a perfectly fine language for a working stiff like me—as are Java, JavaScript, Python, Ruby, Scala, Scheme, and the many other languages I have learned over the years. In the end, I try to select the right languages and tools for the specific job at hand, and that means switching languages like hats.

There is nothing wrong with using fun ways to learn, such as approaching Ruby via Why's Poignant Guide and Shoes (like I recommended in another recent post). There are arcane and mystical paths, such as banging your head against The Little Schemer and The Seasoned Schemer on your way to SICP. Many modern thinkers would have you skip all that older academic and "enterprisey" stuff and dive directly into JavaScript, JQuery, and HTML5 instead. There are many ways to get started so don't waste too much more time. Just pick one and get coding!

Realistically, I believe few working professionals these days would send you backwards to learn Assembler or C/C++ first. Frankly, if they did, I do not believe they would be doing you much of a service.

So, to embellish a little on "start with what you have," I have three more bits of advice:

  • Pick one programming language that seems cool to you and one learning approach that seems to make sense and give them your all. Become literate in your chosen language; read as much good code as you can manage!
  • Get your hands on your keyboard right away and start coding as you learn. Do all the elementary exercises in your programming books by yourself and practice all the tutorials you can find with your fingers happily clicking away to make them really work. You'll be surprised by how many skills you will gain while fixing errors in demos that are supposed to be working code but are not!
  • Spend most of your effort on learning how good programmers think their way through problems. Learn how to analyze and decompose complex problems and systems, breaking them down until you really understand them. Then learn to synthesize and design automated solutions, building them up so that they make some task easier for some human beings on this planet.

I started with FORTRAN IV and QBASIC and if those didn't ruin me, C# will not hurt you, either! Good luck and make sure you're having fun while you're learning!

show 1 more comment

I think the best piece of I've advice I've ever seen when it comes to people asking "What language should I learn?" is simply: a good programmer can work in any language.

There are arguments against that statement I'm sure, but the point is: learn to be a good programmer, instead of a language expert, first. Builders don't specialise in building on exactly one plot of land, they learn the skills of their trade and apply them on whatever plot of land they're required on.

show 1 more comment

Sometimes I suspect languages of choice have a lot more to do with our personalities and they way we're wired and a lot less to do with practical or academic considerations than we'd like to admit.

That said, learning new stuff is never harmful. You'll know the day you've crossed the threshold towards an evolved or perhaps broken brain (all a matter of perspective I suppose) when you start to realize that everything has a manual. You can ultimately really do anything you want if you've got some talent and are actually interested in the doing rather than the being aspect of a programmer.

At least mess around with Python and JavaScript. It's a definite learning advantage to really be able to just write code and watch it execute immediately in a file I/O accessible console environment like IDLE or a sandbox environment like a browser. What I dislike about C# and Java is that they want everything to be confined to classes even if you're really just writing a simple function with pointless wrappers around it to keep your peers or an overly restrictive compiler happy. The other thing I like about JS and Python is that they really let you set your own paradigm. A little too flexible by a lot of developers preferences. I'm still not sure what to think of the wisdom of overloading basic operators but I'm pretty sure I love Python for allowing the option.

Also don't fall for the cruel lie of choosing the primary language with the most job listings. It's better to be a big fish in medium waters doing what you like than a member of a horde of mostly crappy insufferable fish that turn every job-search into more of a lottery than a matching process.

show 1 more comment

C# is not as bad as Java by a considerable stretch. They have better support for many concepts like functional programming, generic programming, deterministic destruction and value types, operator overloading, etc. Their support for these features could still use a lot of work, of course, but it's vastly better than Java, even if it is no C++.

Secondly, I think that you're mis-reading what Joel has said. If you can master pointers and recursion, then it doesn't matter what language you're using now. The most important thing would be to use a little unsafe code, get to grips with unsafe quicksort or something, and then go back to the rest of normal C#.

Oh, and get reading :)

add comment

The first language productive for me was C#. Though i had fiddled with Foxpro in school time and a bit of C in College. C# is pretty good and very nice starting point for anyone. It follows the general fundamentals of programming like strong typing, encapsulation, inheritance etc which I believe one should always learn, no matter if they use them or not. Later, You can always move to other languages like Python which doesn't follow the standardization of fundamental programming.

The other adding factor which people don't really add to the learning aspect of C# is the availability of best IDE for any language I have seen. Eclipse IDE is good too, but once you used Visual Studio, you will thank microsoft.

C# being enhanced over C, ensures that you don't need to learn other languages beforehand. All the languages over a decade or so has evolved from the nature of C, even the JAVA.

So, the verdict is, C# is a great starting point that renders you the ability to learn other languages fast in future

show 1 more comment

Learning C# as a first language is no mistake as long as you sooner or later move on and start learning a second language. That's far more important. Even better if that second language is somewhat different from C# (javascript or ruby would in that respect be better that java). Every language has its pros and cons, and it's the differences that will make you a better programmer in the long run.

add comment

As much as I advise you to learn many languages (as do the others suggest), make sure you know a (couple of) language(s) you learn very well.

The risk of knowing many languages is that you might never learn a language completely causing frustration when actually wanting to solve a problem.

Knowing the for-loop construction is many languages is fun but useless if you don't know how to handle errors in any of them.

add comment

Don't worry yourself about it that you happened to learn C# first. It's akin to being concerned that your first step was taken with your left foot or right foot. The only difference between learning a managed language first is you're just delaying when you have to learn pointers and detailed memory management. This can actually work in your favor, since when it's time to learn C the only new stuff you'll worry about is memory management- you won't also be juggling trying to learn control structures, the concept of functions, etc. and will be able to concentrate completely on pointers and memory management.

The stereotype exists because there are managed language programmers who never did that second part and learned C and C++, and then applied to C and C++ jobs.

It's like learning a musical instrument- the first one is difficult because you're trying to learn the mechanics of reading written music AND the physical mechanics of articulating an instrument to do what you want. For the second and subsequent instruments you learn you can concentrate solely on what makes that instrument different from what you already know.

add comment

It's tough on the novice, without a doubt. I've done vb, javascript, PL/SQL, T-SQL, Uniface and a bit of C# to name a few.

Someone earlier mentioned Visual Basic as where they learned about object oriented programming, and to be honest VB.NET has the most easy to understand syntax of any language I've ever seen. The best feature is that the keywords match the concepts being described closely.

e.g. Function myHandler() handles myButton.click

or Class Human Extends mammal implements intelligentLifeform

Seriously, for readability when you're a novice what else would you want the syntax to look like?

When you are looking for properties and methods (and distringuishing between subs and functions) it's a lot easier to read in VB.

Similarly when declaring variables

Dim myString As string - obvious which is the type and which is the instance

C# case sensitivity encourages what to me is a seriously bad habit - having the same name for class and instance with one being uppercase and one lower.


Human human

  • are there seriously so few words in yuor volcabulary that you have to re-use existing ones with uppercase?

if you call human.think, it would be easy to mistake an instance for a class and think you were calling a static method at a glance. And glancing is often how we perceive code, we don;t have time to mouse over every single element to let the editor tell us what's going on.

C# might have some advantages, but it is a lot more difficult to start on - even if it saves typing. Which is why there should definitly be a place for both languages.

show 2 more comments

The biggest downside that I can see is that Visual Studio and the associated tools are very, very nice -- things like intellisense and code completion can easily become crutches. I'd generally argue that the environment can be so nice and supportive that you tend to feel a bit lost when you need to, say, go hack ruby code in a text editor. Oh, and you'll usually miss stuff like linq too.

add comment

C# is perfectly fine to start programming in.

It is what I was told to start with, without even having the chance to dabble in anything else (apart from the Hello World in Java, some basic LOGO stuff, and some things in Scratch, but nothing "Serious").

Overall, it can be difficult - there are a lot of things that don't seem intuitive, and it does have it's limitations, but I think it encourages good coding and is great once you get the hang of it. I mean, it gives you more power and is a little more professional than Python (which is usually suggested), and that would make a world of difference - trying C++ after C# was not too painful, but if I had started with Python, then it would be a very big hurdle indeed, even just at the syntax level.

Also, it has good cross platform support in the form of Mono (for those of you who think Mono is not a big deal - the Unity Game Engine lets you code in a version of it). It also is pretty useful for most things, whether it be game scripting, or web designing, or Windows Applications. Of course, some languages will be better for certain lines, so it will depend on what general direction you are planning to go in - for example, if you are going in the web direction, then C# (ASP.NET) would definitely be a good idea. If you are planning to get into games, then you should think about C++ instead.

In the end, it is well worth learning it, even if you don't end up using it in favour of the simplicity of Python or the archaic nature of Java (as the release cycle for Java is REALLY slow) - you learn good coding practices, while not being too complicated for a newbie to learn.

How is that? Still hard to read, or ok now? Thanks by the way for the heads up. –  Sbspider Nov 19 '13 at 6:14
show 1 more comment

To be a programmer you need to have passion. The programmers I know are the ones that go out of their way to learn and notice industry changes. I started my programming with basic on a Commodore Vic 20 (Yes that old) and kept moving on to other new languages. Part of my programming years even included COBOL. I also started to notice that some languages worked best in certain processes vs others. My advice to you is to learn any language and to understand basic programming concepts like loops, methods, comparisons. Most languages support those three concepts. You should never say "This is the best way" but rather "How can I improve this ". The worst thing about that last sentence is that you could catch yourself over engineering. Programming is fun, make it fun! The internet opened up a whole new way to experience programming because the level of access we have to information today is staggering. For me before the internet I had to go to the shelf and pull down the GREY IBM programming books and learn. Today you can simple type a thing into google and whammo.

this post is rather hard to read (wall of text). Would you mind editing it into a better shape? –  gnat Oct 17 '13 at 21:16
add comment

Wow a lot of answers. Here is my point of view:

C# is no place to learn computer science. I see it as an exceedingly bad idea. I will list some of my concerns below.

  • C# is a Microsoft language. Not that I'm judging MS here, just that outside of the MS world there is little uptake. If you just want to program MS hardware then go ahead but I don't see this a a solid approach to computer science.
  • I'm not a big fan of learning to program with managed languages. I believe their is value in learning how to manage a programs memory and the construction of data structures.

Too tired to go on so quickly choose another language.

show 1 more comment

I would recommend C# or any language that offers these three things at their core:

Fully typed Compiled And fully object oriented..

A first language that offers these three core will teach a lot about program flow, syntax, and how to do problem solving in a more structured manner. I live and breath inside a bunch of great languages that dont't have these attributes but if I were teaching someone a language I would pick one that had these three requirements.

add comment

No, that answer is terrible. Why? Well, he does prescribe some good books which you def should read, but without classroom work and lab (computer lab) work, you'll be lost and frustrated. You need to be with a bunch of other new programmers experimenting because there is soooo much to learn other than what's in those books. I'm not saying you have to go for a BSCS, but you need access to a knowledgeable instructor as well when a whole slew of things can go wrong at any instant, such as compiler problems, build environments... you name it. You won't be much of a programmer working in a vacuum. Whatever books your courses require will be good enough as long as you pick a halfway decent school.

So, sign-up for some classes and it will be a LOT more fun! Plus, if you plan on getting a job as a programmer you need connections and you'll hear all the buzz about companies recruiting at the campus, etc..

Finally, formal education is very important as programming requires a lot of theoretical background knowledge to understand how things are supposed to work at all levels (hw/sw) so you can figure out how to fix things. Just about everything is a black box, so you have to be able to figure out why something is behaving the way it is so you can take the next logical stab in the dark. Without at least a 2-year programming degree (whatever you call it) you'll be at a disadvantage.

P.S. I wouldn't go near .Net, or C#, until you've experience Java. C# is not pleasing to the eye. It's messy and clutered looking code. The .Net IDE sucks beyond belief. It's in the dark ages of IDE standards. Java:C# ~ Data:Lore

I'm with you up until the last paragraph. It states your opinion of C#'s aesthetics in such an inflammatory way that it just doesn't seem to belong in an otherwise good answer. –  Anna Lear Aug 12 '11 at 4:45
Even prior to the last paragraph, this is mostly nonsense. Some people learn well in a class room environment -- but for others it's an utter waste of time. Learning theoretical background is important, but that doesn't necessarily require a classroom or formal education either -- they help some people, but not (even close to) everybody. –  Jerry Coffin Aug 12 '11 at 12:22
Stackoverflow has become that "lab" for many people who can't go to college but want community support. Is it the same as a class? Of course not. Is it good enough? You bet. –  BlackJack Aug 12 '11 at 23:35
show 2 more comments

protected by MichaelT Nov 29 '13 at 2:18

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.