Here are three great reads that I suggest you should look into.
This one was an eye opener for me and I totally agree with the author’s vision. While I was reading What Is Software Design, a lot of things suddenly made sense.
To me this is in stark opposition to the “software construction metaphor” proposed in the first edition of Code Complete (I can’t attest to the second version as I only read the first one). Thinking of software as a physical building project has lead us to replicate some of the artifacts of a physical building project. Many of these paths have been dead ends. We always have to be careful when making analogies.
While Beating the averages makes a strong case for Lisp, that is not what most struck a chord with me. I agree with many points presented in the article but I feel I can offer some counter arguments to the use of “the best” language as defined by the author. These include: lack of first or third party libraries, lack of documentation or lack of a community (on and off line). These should all factor in the final language choice as they influence the success of a project.
The thing that gave me the most food for thought was not this argument for Lisp but rather how the language we use shape our way of thinking, how it affects our problem solving and how it defines us as programmers.
This is the main reason that led me to Seven Languages in Seven Weeks, something I am thankful for.
Following this experience, I personally recommend to anyone currently using a single language to truly learn another language. Learn something different. Do not go from C# to Java but rather from a statically typed language to a dynamically typed one. Or to an object-oriented language to a functional language.
Something that will challenge your assumptions about your current workplace language and programming languages as a whole.
This next one is a little dryer and a bit more tedious… ok, a lot more tedious. To tell you the truth I glossed over some sections. I still encourage every programmer to go and read everything up to Guard Digits and the Precision section. Read more if you can. The Wikipedia article on floating point numbers is also good, read Accuracy problems if nothing else.
Read these two links and you will see there is more to just loosing some wee bit of precision in the last digits when using floating point data types to represent base 10 values.
If you want to see the effect of this try this bit of C# code (source Marc Gravell on StackOverflow).
double x = 3.65, y = 0.05, z = 3.7; Console.WriteLine((x + y) == z); // false