As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 10 years ago.
Recently I came about this concept of Design Patterns, and felt really enthusiastic about it. Can you guys suggest some resources that help me dive into Design Patterns?
You know, for me, one of the best books out there is Head First Design Patterns. I personally like the style that they use to communicate the material.
Wikipedia, the Gang of Four book, and if you're specifically interested in C# implementations there's a decent site here.
One of the best books is (as mentioned above) the Head First series because it gives great analogies and real-world examples.
There are also other decent Java Design Pattern books available. Also, web sites that are specialized on the subject (see posts above for some)
Although the Gang of Four book was my first read on this subject, it is my opinion that you should avoid it especially if your starting out. At the time this was the reference, but today many books exist giving you many to choose from.
BUT, and I clearly emphasize this point... practice is the ultimate learning tool. After having read several books on the subject, I was 100% certain of knowing and understanding these patterns. When I attempted to actually implement some of them I soon realized that my knowledge was mostly 'theory' and my comprehension wasn't even close. A huge blow to my ego!
I set out to test and challenge my peers and quickly learned that they were in the same boat as I was. I find that 99% of programmers proclaim to know patterns but when really put to the test, only about 1/3 actual know the subject well.
I set out to implement as many patterns as I could in one or more complex systems. I put theory to practiced and what I learned was a gold mine.
One of the most challenging aspects of my experience was that each pattern alone look simple. But sometimes linking a bunch of patterns together can be even more challenging.
I encourage you to put theory to practice!
Jeach!
Here is a very nice screencast series on Design Patterns on DnrTV
Part 1
Part 2
Part 3
Part 4
Part 5
Hope this is more inviting ;)
The gang of four design patterns book is the standard. I recommend it if you're comfortable with C++.
Head first design patterns is good too, especially if you like visual aids and want to feel like you're learning design patterns in a '50s diner. Examples are in Java.
There are sometimes multiple ways to implement patterns in a given programming language (for example see this discussion of options for implementing the Singleton pattern in C#), so it might be worth getting one book to succinctly describe the common patterns, and another to suggest the best way to implement them in your favorite language.
I frequently reference this site: Design Patterns . It has a nice write up including examples for all the popular design patterns for free.
Here're the two I found a while back
http://www.dofactory.com/Patterns/Patterns.aspx
http://amazedsaint.blogspot.com/2008/01/design-patterns-part-i-and-ii.html
ASP.NET has good reference to DPs.
http://wiki.asp.net/page.aspx/276/design-patterns
Head first design patterns book is a good read.
If you want to test your knowledge of design patterns , here is the design patterns quiz
Microsoft Pattern and Practices Developer Center
Really, I think the best way to learn them is to deeply understand your language (C# based on your tags), and then to really commit yourself to the goals of having good separation of concerns, low coupling and high cohesion. I'd read and study Robert Martin's writings about SOLID principles.
And then (and this is the most important part), try to follow those principles as you develop software. You'll find that you start to do certain things, and later it will hit you, "Oh! That was the strategy pattern." This is truly what the "pattern movement" demonstrates ... people working in a certain kind of language, trying to achieve good software design, will find themselves arriving at solutions that follow certain common patterns.
I like these 2...
http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612
http://www.amazon.com/Refactoring-Patterns-Addison-Wesley-Signature-Kerievsky/dp/0321213351
this one really helps with taking existing code and implementing a design pattern.
I find Design Patterns Explained to be a good introductory text. The Gang of Four book is a reference for those who already understand patterns.
Martin Fowler's website has plenty of information: http://martinfowler.com/articles.html.
Much of this is covered also in his book, Patterns of Enterprise Application Architecture.
For those using C#, I found Design Patterns in C# a bit easier read than GoF's book. The examples of course are in C# and the connection is made to the Microsoft naming of the patterns.
Last year I bought and read C# 3.0 Design Patterns, by Judith Bishop and I've been very pleased with it, having previously tried to get through Go4 and Design Patterns in C#.
This covers the standard set of patterns, grouped by similarity, in order of increasing complexity, but also ties them in to the language features of C# 3.0, so you start with simple cases with interfaces and abstract classes, and move up through extension methods, generics, anonymous types, functions, etc - a very good way to learn both.
All presented in an easy to read format, with quite a few real world examples and handy source code.
Related
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 9 years ago.
I have been working with C# for many years, since beta. I am having a bit of a time of it, moving from OOP to functional-oriented programming (FOP). I started out with the concepts of procedural programming and functional composition in the late 1980s and have been doing OO since around 1995 when UML was in its infancy where I was programming in Delphi with the multi-paradigm approach of procedural and OO. Are there any good books suggestions, to helping the transition over to functional programming from a deep rooted OO programmer?
I tried a Haskell book, but it seemed to require some background in the subject and was very unapproachable.
I have a couple of O'Reilly, Apress books on F#, but it all seems a bit woolly and half way house, of just getting the job done. It also mixed objects up with functions to suit the needs.
F# seems to forgive me in my OOP thinking a lot more than Haskell, but I think to get the true benefits I need to get into the mindset of FOP to get the best out of the code. I have read around functional programming for about two years in between my day-to-day C# stuff. But I feel I am not getting into the thinking.
I am pretty sure that there are many people out there like myself. Any answers would be, I think, a great help to a lot of C# guys wishing to move over to F#. Especially with many big hitters in the market place asking for F#. I am a contractor who needs to get up to speed as soon as possible.
This is definitely subjective, but I think that many people are asking similar questions. I certainly did when I started learning F# (as someone with C# experience). Here are some assorted ideas:
Pick the right learning problems - The best way to learn functional programming is to start working on some non-trivial projects. If you pick a project that is easy to solve in the OO way, then you'll probably lean towards OO solution. However, if you choose some project that naturally fits FP solutions, then you'll learn something. In my case, I worked on translator from F# quotations to JavaScript, which involves a lot of recursive processing and discriminated unions.
Don't try to be perfect - If you try to write something in the functional way, it may not be perfect at the first attempt. Don't worry about that (and don't say to yourself that you could do better in OO way). You can do better in the FP way as well - it just takes some time to find out how to do that.
Try to be purist - If you start learning Haskell then you'll have to write pure functional code. F# doesn't enforce that, but I don't think that makes F# less suitable for learning functional programming. If you know C# and .NET, you can reuse a lot of your experience. Just try to be more strict to yourself and avoid using non-functional constructs like mutable state and inheritance - they are sometimes useful, but you can use them after you learn to think in the FP way.
And a little shameless plug - answering a question like this was one of the key motivations for my Real World Functional Programming book, so maybe that could help...
Are there any good books suggestions, to helping the transition over to functional Programming from a deep rooted OO programmer
The Structure and Interpretation of Computer Programs (SICP):
Book: http://mitpress.mit.edu/sicp/full-text/book/book.html
Video lectures: http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/
His course seems to focus mostly on functional composition. It is in LISP, but it is less about the language, and more about the abstract concepts.
I don't think he says much (or anything) about pure FP, but I haven't really read all of it, either :) The concepts and way of thinking should still be highly applicable, though.
I believe that to really understand functional programming you must first reorganize all your knowledge about the ways to implement different things (e.g. you have to understand that objects may be represented as hash maps or even associative lists, not just as records). Also you will need to start thinking in terms of immutable data and pure functions (procedures of no side effect). Then you'll have to compare functional and procedural ways to implement and treat objects.
All of this you can find in SICP - classical book for learning not only FP, but programming in general. To understand functional way you won't have to read all book, but at least first 3 chapters.
After you understand main FP concepts and are able to implement anything in it's style, read any book on statically typed languages. E.g. Apress books on F# will be much easier to read.
Learn You a Haskell is a decent read, though it's probably a bit too basic given you probably already know the syntax of Haskell from one of those books that you picked up...
Moving up a notch, there's Programming in Haskell, which if you scroll down on that page, has a bunch of links to video lectures based on the book given by MS Research's Erik Meijer.
The Equational Reasoning stuff is particularly interesting, if only academically.
In terms of application, that Real-World Functional Programming book given in the other answer looks really nice -- though I haven't read it, so I can't make any judgments.
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 9 years ago.
I am tired of tutorials that just enumerate the concepts with examples. How about some tutorials that show the wrong way of doing and then the correct way of doing things? It would be great to learn things like interfaces, delegates, abstract classes, singleton ...etc that way.
It would be great to read some clean code online as well but its hard to find...
any recommendations??
I develop in C# , .net , MS technologies...
I think the Head First books provide a really easy to read and learn from approach to learning the basics of software engineering. You can do Head First C#, then Head First Design Patterns and Head First Object Oriented Analysis and Design.
Then again, these books aren't free....
You might want to look for AppDev and/or Total Training e-learnings.
Meanwhile, there are some webcasts on Microsoft website that are very interesting. I learned MVC architecture that way.
Microsoft Events and Webcasts
http://www.dofactory.com/Patterns/Patterns.aspx covers all of the GOF patterns, with examples in C#.
http://www.oodesign.com/ is another great reference site. Also covers all of the GOF patterns, with code samples, and a more in-depth explanation of each. Also lists pros and cons of each pattern, and appropriate situations to use them.
Have you read Design Patterns: Elements of Reusable Object-Oriented Software by the "Gang of Four"?
That was the book which made me glad that I'd learned a programming language that supported object-oriented programming.
It doesn't show the wrong way to do things, but part of the "pattern description" are the "forces" or circumstances for which each pattern is a useful solution.
The code examples are small (but clean).
For me with C#, I'm always going back to Juval Lowey's Programming .NET Components.
Object-Oriented-Design-Heuristics is great and appropriate for your needs IMHO. Head First Design Patterns is wonderful also, with interesting examples of incorrect and correct practices for certain cases.
You might be able to find some good advice on programming techniques, but there's no wax-on-wax-off for coding skills. You learn by doing it. Mostly by doing it wrong a lot at first. I know it sucks, but it's the way it is.
Unfortunately I don't know if there's any such resource out there, but this sounds like a great idea for a website. Something like fmylife.com, but specifically for OOP where users post their real-life problematic object-oriented solutions that can be discussed and fixed very much like in SO. All questions and answers tagged with a specific design pattern would represent real examples for that pattern.
Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 9 years ago.
Improve this question
I am not the only programmer, but I'm the only .NET developer, everyone else works with Perl, Ext JS, and related technologies. I'm primarily self taught, using Codeproject heavily to learn new techniques.
Without any mentors at my company specifically knowledgeable in .NET, I'm unsure whether classes, or online tutorials, books, or perhaps some other avenue might be most effective at helping me to become a better developer.
My goal, optimistically, is to become a developer capable of managing the next .NET developer we hire, or at least to integrate well with him/her.
I'm currently taking on the task of documenting my programs in such a way as to receive review from the more experienced developers at my company regardless of them not knowing .NET, and I expect this will be rather general, but hopefully still beneficial.
Does anyone have suggestions or advice for how to most effectively learn good practices without direct oversight?
Without mentors around, there are several things you can do to improve your skills:
Take classes...especially if your employer will pay for them.
Read books. They're the next best thing to a class.
Read developer blogs. They may not teach you best practices, but they'll keep you abreast of what's new in the development world. That'll help you keep from falling behind.
Courtesy of the Community Listen to Podcasts (Hanselminutes, Stackoverflow, etc.) and watch Screencasts (Dimecasts has tons of good content).
Participate in the community. We may seem harsh at times, but you'll hear the most about best practices, coding techniques, design patterns, etc. and different ways to apply everything.
I have always worked like that. My ways to improve are:
Reading high-quality blogs
Applying what these high-quality blogs recommend (whenever it fits your project and when time allows, of course)
Reading high-quality open source project's source code
Writing as much code as you can, always keeping in mind what you've learned and always trying to raise the quality bar. Practice does not make perfect. Only perfect practice makes perfect.
Keep an eye on stuff that's unrelated to your own line of work. For example, if your main job is coding ASP.NET in C#, read stuff about functional programming, F#, Haskell, other web frameworks like django, Ruby on Rails, etc. I'm not saying that you learn them, just see how things can be done differently. It will broaden your perspective.
When you gain some self-confidence: contribute to open source projects, write a blog.
About books: IMHO the books that are highly-technical (i.e. "Buzzword 2.0 in Action!") aren't worth your time. Everything happens so fast that they'll probably become obsolete 6 months after their release. The only books worth buying are those that deal with the underlying CS or architecture issues.
About classes: it's very hard to find high-quality non-university classes that aren't a waste of time/money. Most of the time you can learn faster by yourself. (UPDATE: fast-forward to 2013, MOOCs are an amazing, high-quality, free learning resource)
Also be wary of codeproject, there are lots of articles there with errors and/or general bad advice.
I am in the same situation you are in. I learn mostly from
previous projects/mistakes, especially when you take over an old project from someone else (50%)
google (25%)
forum/stackoverflow (25%)
Change employers. I'm not trying to be a jerk, seriously. The most growth your going to have as a developer is by working every day with someone significantly better than you.
Join some OSS project which works with .NET to get feedback on your code from experienced .NET developers. In addition looking at other people's code is a great way to learn new things - just as you have been doing. I also agree with Justin also that reading blogs like Eric Lippert's is very rewarding
Take advantage of the chance to learn the languages and technologies being used by by your colleagues.
They'll introduce you not just to syntax, but more importantly to techniques, idioms, and paradigms that you won't find in .Net, but that will challenge you to think about how you could apply or build those thing in .Net, or why .Net doesn't have or shouldn't use those things.
Why is Perl weakly typed (or is it)? What's Perl better at than .Net? What is .Net great at the Perl is just terrible at? Why do these differences exist? How might you implement a Perl interpreter in .Net? Why might you want to?
Why's everything in a JavaScript a hash? How does .Net class inheritance compare to JavaScript prototypes? Are JavaScript's first-class functions a great tool or a source of obscurantist abuse, compared to .Net's strongly and statically typed classes?
What are the fundamental data structures in each language? For each language, why are those types fundamental to that language? What were the different design decisions (or lack of decisions) that motivated and informed each language's design and implementation? Can you discern any common "ancestral" languages among the languages used at your workplace? Why don't we have "One Language To Rule Them All"? Should we?
Finally, excellence at any one language is really great to have, but unless you're sitting on that language's Standard Committee or writing compilers/interpreters for that language, a broader knowledge of the underlying algorithms and data structures and patterns that are common across languages is probably more important to your development as a programmer -- and certainly to managing programmers, if that's your goal.
Look for local .NET user groups. In most cities, you are likely to find at least one. User groups are a great place to develop contacts, ask questions about the technology and basically get answers to problems you may be experiencing. If there are no user groups in your area, try looking online.
If you are free to choose how you develop, and you get new projects fairly often, pick a new technology you're not familiar with to use on each project. Of course, do your research first and make sure it makes sense for the project.
At my last company, I was pretty free to use whatever I wanted as long as it made sense and worked. I always tried to use something new on each project. The last project I worked on, I used NHibernate. No one told me to learn NHibernate, but I took it upon myself to use it to expand my knowledge. Of course, I made sure NHibernate was acceptable first.
The best way to learn something is to use it. Classes and books are good, but nothing will make it stick more than using it in a real project.
My goal, optimistically, is to become
a developer capable of managing the
next .NET developer we hire ...
In that case, you should be looking to expand or improve your people/project management skills as well as developing your technical programming and design skills in your chosen technology.
I also subscribe to the view that it is not a good idea to focus too much on a particular technology; e.g. .NET. Too much specialization tends to limit your career prospects.
A year ago I was pretty much in the same boat and it's interesting when I look back at the things I wasn't so good at. Awareness of the technology you are using is an important one, many people have suggested reading books/blogs etc which are good.
One thing that may help you, is to look at the MCTS material, starting with a foundation exam (I'm working toward 70-536 .NET 2.0 Framework exam) to make sure you have a good base. One of the advantages of this is one that it is credited by Microsoft so you can add it to your CV for the future and it gives you a more structured approach than just reading books.
Secondly read up on design practises, or even design principles (such as Gang Of Four). Do your best to not cut corners, and develop your code in the best re-usable way. This keeps you thinking about design and maintainability which is extremely important.
Finally I'd probably suggest trying to ensure you're not doing the same thing over and over. Don't just work with databases, or UI's etc... Try to get a mixture of things to try new techniques and learn new stuff.
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 10 years ago.
How can I increase my proficiency in programming? I have a grasp of the basics of C#, but don't feel too confident about my ability.
Code something in C#
Read C# Code and try to understand it.
Read a C# Book (and please none of the C# in 21 Days books)
The confidence comes with the experience.
Read Stack Overflow every day :)
Seriously. Try to solve interesting problems. Even if you don't post your solution, come back later and see if other people came up with something similar, why their solution might be different, etc.
Project Euler.
http://www.asp.net/LEARN/videos/
Voile, you are programing ASP.net.
Keep in mind that you may need a little more grasp on C# as your codes evolve. For that use a good book, most Microsoft's learn C# are pretty neat(The learn ASP.net is quite lame).
Of course, thats what I did back then(about 2 years ago), nowadays you should be able to find some awesome tutorials online.
Good luck ;)
Think of a fun project of some complexity (more that "Hello, world") and code it.
Practice, practice, practice!
Also read forums, blogs, participate in discussions. You will learn many things that aren't even mentioned in books.
read lots of code, write lots of code and keep a copy of C# 3.0 in a nutshell handy.
Learn new programming languages. Learn data structures and algorithms and design patterns. Learn regular expressions. Learn databases. Learn HTML/XHTML/DOM. Learn learn learn learn learn.
In programming, knowledge === power.
Work on something, even if it's reinventing the wheel. You can read books, watch videos and listen to podcasts all day, but the real experience comes from actually building an application. Don't build an application that you know you can build - instead, create an application that is slightly out of your reach, then rinse and repeat.
The experience when you realize that you created a mess of spaghetti code that is unmaintainable cannot really be substituted, as this then really allows you to look into techniques to improve your code. Sure, feel free to read on MSDN about Events, Delegates and Lambdas, but reading about them in the moment you need them means that the knowledge really burns into your memory.
I try to have a rough knowledge about as many topics as possible, but that's usually rather shallow: I know that a technique exists and roughly what problem it solves, so that when I need it I can learn about it.
In my opinion, the only alternative to first-hand real world experience is even more first-hand real world experience.
http://www.appdev.com/csharp.asp
:)
You say you are learning ASP.NET and C#. Have you ever done any programming or web development? Because, if you have not, then you need to take a step back and learn the basics of HTML, CSS and get a grasp of how data is passed via HTTP between client and server. I would also strongly advise getting a grounding in basic SQL, because most serious web development will utilise databases at some point.
After that, some basic OOP (Object-orientated programming) theory would do you good. That way you have a good grounding in the subject-matter before diving into the coding.
For learning C# the I'd suggest a couple of good tutorials:
The C# Station Tutorial and Softsteel Solutions C# tutorial.
I also found the ASP.NET Quickstarts useful when I was learning ASP.NET - I prefer to learn by example than by theory.
As for confidence, I'm afraid that only comes via experience. Perhaps try answering a few questions here? Getting a few up-votes might just give you that boost. Good luck.
This fits in to catagory of answers you've received thus far, but review open source projects.
Understand how they work and maybe even why they were put together in a given way. Not only will it improve your ability to write C# but it will also improve your understanding of Software Engineering which is ultimately how you put a programming language -- C# or otherwise -- to good use.
Creating a Project that makes use of a lot of different technologies is a good way to grasp a 'big picture' view.
As an example, think of an n-tier application where you input a value into a very simple web page, this value being sent into a web service, and behind that WS a simple business layer that switches between readings into a table of a data base, then you return the value finishing the output in a postback of the initial web page. In my Personal opinion, every element of the layer is a simple one, but, making the whole system work without errors is good beginner's challenge, that way you could build a confidence in your skills, enabling you to undertake any other idea.
Well, that were my two cents. Good Luck!
There may be so many projects that u can make.choose the project that makes u.it's true take a project that you consider difficult for your level.
1) analyse your project
2) define the objective
find things that are necessary to achieve the objective
3)then derive an algorithm which clearly explains the workflow
4)then start woking
In my experience "Learn By Working" is a good idea.first grab the basics then start the work soon you'll learn step by step.never give up ,be a ceaseless crusader.
practise practise it's a only way of surviving as a programmer.
Being a best programmer requires a lot of patience,thinking skills,Attention,a thrist for knowledge.
Wise people always replace the fear of unkonwn with curiosity
Actively participate in programming (and non-programming) forums.
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.
Closed 10 years ago.
I'm trying to understand the concepts behind DDD, but I find it hard to understand just by reading books as they tend to discuss the topic in a rather abstract way. I would like to see some good implementations of DDD in code, preferably in C#.
Are there any good examples of projects practicing DDD in the open source world?
Eric Evans and a Swedish consulting company have released a sample application based on the shipping example that Eric uses throughout the book. It's in Java, but the concepts are well documented on the project page.
http://dddsample.sourceforge.net/
However, be warned that DDD is more about the journey than the destination. Understand that the sample code you are looking took many forms before it became what you see now. You did not see the awkward models that were used initially and you're missing the steps taken to refactor the model based on insight gained along the way. While the building blocks are important in DDD, Eric belives they are over-emphasized, so take all samples with a grain of salt.
I'm not sure how complete it is, but I found the NDDD Sample on Google Code.
I'm surprised no one mentioned Macto, Ayende's DDD sample. The most important thing about Macto is that the hole thinking process before the actual coding is presented in a series of posts. DDD is not about implementing a model, is about modeling a business domain. Decisions like "some concept is an Aggregate Root/Entity/Value Object" are far more important than how will an AR be persisted.
Also i would recommend Udi Dahan's videos about SOA and CQRS which might provide a better context on which to apply DDD.
This is not an open source project, but still it is an example in code: http://www.codeplex.com/dddpds
The example is used in the book .NET Domain-Driven Design with C#: Problem-Design-Solution
A made-up example that seems promising but might have died:
http://www.codeplex.com/domaindrivendesign
I'm afraid that http://www.codeplex.com/domaindrivendesign has indeed died, but if anyone is interested in contributing feel free to contact me.
Overall I would recommend against relying too much on examples of DDD, at best examples can show the results of the domain modelling and/or one approach for implementing the patterns. I would thus recommend reading the book and then asking questions at the forum.
http://kigg.codeplex.com/ is a good example for me.
I know it is not C#, but this is a java meta-framework that follows a domain driven approach: I don't know much about it but I'm willing to study it in the near future: Roma Framework
http://sellandbuy.codeplex.com/
another project DDD
A good read is Jimmi Nilssons book (and blog for that matter)
Applying domain driven design
It's a mixture of Evans and Fowlers books (Domain-Driven Design - Evans), and (Patterns of Enterprise Application Architecture - Fowler)
I haven't used any myself, but there are some tools mentioned on the DDD Wikipedia page. Most of them seem to be implemented in Java though.
http://en.wikipedia.org/wiki/Domain-driven_design#Software_tools_to_support_domain-driven_design
Ok, I found this, but it's Java not C#:
http://timeandmoney.domainlanguage.com/
Code Camp Server, Jeffrey Palermo's sample code for the book ASP.NET MVC in Action is open source and uses DDD.
(Same as my answer in Good Domain Driven Design samples)