I’ve been working with C and C# for ages, I consider myself a “pretty good” programmer, but as has been pointed out many times, programming is only a small facet of software engineering and development. I’m the sole coder for my department but it looks like that is going to begin to change, what I would like to know from the Stackoverflow community is the following.
- What does it take to move from coder to developer – I’ve read Code Complete so I think i’m ready to take that plunge. To some degree I already am.
- What tools should I use when doing models of my software – assume C#
- How deeply should I model my architecture before setting down hard and fast code? – I realize how subjective this question is, and I’d like rules of thumb more than “well it depends.” Assume i’m writing in house tools that are intended to “last 5-10 years”
- What advice would you be willing to give to someone making the move from codeing to engineering?
Thank you all in advance! Have a great Memorial day!
Firstly the generic answers:
Now the specifics:
Failure to plan is to plan for failure
Your environment, software needs, target audience, network support staff, budget and any number of other factors will greatly affect the solutions you provide. For instance, in the type of environment I code for, I tend to draw on a finite set of tools for delivery of products, and they will likely vary for your environment:
I may use one or more of these technologies for my solution dependent entirely upon what is being asked of me. The key is to understanding which is relevant for a given situation and only using those necessary. For instance don’t write a full blown web application if a command line utility can easily be used by a single user, don’t write a Windows application if many users need access to an application that can’t easily be installed on their machines due to user restrictions and limited systems support personnel. Don’t write a command line utility for users that can barely navigate around windows with their mouse and don’t expect a Microsoft expert to support your *nix based system.
Provide diagrams and documentation that make it simple to diagnose issues so that when problems are found [and they will be], users/deskside support can easily narrow down the problem to a particular component in the system. This will make your life easier because they’ll either be able to fix it themselves or provide you with enough information to fix the problem quickly and simply.
Edit: in response to your comment regarding UML which is great for the purpose, but once again you have to be aware of your target audience. If you’re a lone programmer that’s developing systems for a small client whose personnel don’t understand UML, you’d be just as well providing a regular flow-chart decorated with simple English. If your target audience is a software consultancy whose business is software development, then by all means, UML is a great tool – especially as with some UML tools, you can have it automatically generate your stub classes/methods for you to automate some of the process. I tend to work in small teams for small companies so I don’t use UML as much as I’d like, and probably don’t understand it as well as I should, but that’s not to say that if I was required I wouldn’t brush up on it. It’s a great tool to have in your toolbox but don’t use it just for the sake of it. Everything you use in the design/architecture/development of your solution should be used for an objective reason – don’t just use/learn it blindly because someone says “you should use this because it’s great”.
The key to good architecture is this:
And most of all: