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've been a developer now for a number of years. I'm pretty good at what I do and can "get the job done".

But, there is a difference between "getting the job done" and "doing the job properly". Let's use an example.

Recently I developed a web site from scratch. The website runs fine and I've had no issues. Looking through the code I thought to myself that I could have done it better. I could have cut down on my MySQL queries. I could have used MVC making it easier to extend (it does need extending now).

I decided to rewrite the project using CodeIgniter. I like the framework. But I then got sidetracked because to cut down on my MySQL queries I had to learn advanced joins.

And this is the problem. Whenever I do a job properly I'm in a constant learning wheel. And topics such as advanced MySQL joins take time to learn, and then time to implement.

I don't work for a company. I do everything alone. So I'd imagine if I was working as a PHP developer for a company there would be separate teams handling the SQL.

Being solo it's difficult. And sometimes, although my knowledge is advanced I find myself asking question, after question. I probably have a lot of pride in my work. But if I had to work for a company handling complete projects I could imagine projects taking a while because I'd have to learn more and more to satisfy my pride and to ensure I'm doing things "correctly".

I do plan on getting a job after the new year. I need the job security. Which is why I'm asking this question.

What advice can you give in terms of self development and self improvement? Should I worry less? Or maybe look for a job as a PHP developer when I won't be handling SQL queries directly?

share|improve this question

closed as not constructive by Anna Lear Dec 30 '11 at 21:04

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.If this question can be reworded to fit the rules in the help center, please edit the question.

48  
if you don't want to be constantly learning you are in the wrong field –  Jarrod Roberson Dec 28 '11 at 21:18
6  
@JamesGuvnaJeffery: if they don't allow (any) time (at all) for learning during a project, I'd not want to work there because as a developer I would stop improving myself. –  Marjan Venema Dec 28 '11 at 21:27
3  
the job is the learning, they don't give you this magical time off to study, actually they do, it is called "your personal time". They don't call it "on the job training" for no reason. If you aren't comfortable being a self initiated learner and learning all the time for no pay, like I said, you are probably in the wrong field. –  Jarrod Roberson Dec 28 '11 at 21:32
5  
Old code is supposed to suck. Do not kill yourself over it; just try to improve over time. Re-writing a working project hardly makes any practical sense. Clients will not pay extra for it. codinghorror.com/blog/2006/10/… –  Job Dec 28 '11 at 22:11
2  
You don't get what I am saying, working for a company is the exact OPPOSITE of what you are espousing you love to do. It is working on someone elses schedule, using what they dictate and how they dictate it with nothing but compromises and no time to study new things on their time and no time to implement thing in new exciting things you learn in your personal time. This is the reality of being a corporate software developer. I doubt you would be as dedicated to a corporate environment as you say you are to your experimental research and development style you are accustom to. –  Jarrod Roberson Dec 29 '11 at 4:15

10 Answers 10

I think your concerns are valid, but you shouldn't loose any sleep over it. It's my belief that a being a technologist comes with the following baggage:

  • You must constantly learn new things. You either learn to love this, or you don't.
  • There's way more things that you will want to master than one could possibly ever know.
  • You will develop skills during a project that you wish you had during the project.
  • As a result, you will always want to go back and redo that project. It's so hard to release something you know could be better.

In the end, it sounds you care about building quality software, which is something that you can't learn. Know that you need to differentiate building a high quality solution with building something that is perfect. It sounds like you're like me, and will never feel like it's perfect. It would be more concerning if you didn't feel like you had a chance to improve yourself and your work.

It's tough to be a jack of all trades (master of none), but you really need to figure out how to identify the things that are most interesting and useful to you, and focus on them. Figure out how best to "outsource" other work to other people or tools.

share|improve this answer

Being solo is difficult. In contrast, when you are working with a team of developers, everyone is learning from each other. As part of team, you will pick up a lot of knowledge by working with other developers, and with a lot less effort than when you try to figure everything out on your own.

That said, as a developer, you have to commit yourself to constantly learning. Whether it's reading documentation for new frameworks, or books on development, you have to make a constant effort to keep your knowledge current and growing. However, being part of a team may clarify what area you need to learn about most at any given point in time.

Regarding your point about revisiting your older code, and rewriting: I've found that my own code always represents the best of what I knew at the time I wrote it. Many times I go back to something I wrote years ago, and slap myself on the forehead, when I see how much better I could have done, given what I know now. But that's the nature of experience, you get it after you need it...

Lastly, when you're developing an application, you always need exercise good business sense, to decide when it's best to cut corners to finish more quickly, and when it's necessary to take more time to learn something new which would improve the design and quality of the application. There's a universe of things to learn in the software world. Without exercising that kind of good judgement, you could find yourself spinning your wheels learning, thinking, redesigning, but never getting anything done.

share|improve this answer
    
+1 for the second sentence. I've learned more from my colleagues, working at a number of different organisations, than I've ever learned from reading (books or online). It sounds from your question like working in a team for a while would do you a world of good. –  David Wallace Dec 29 '11 at 8:45

You may think that learning new technologies and problems is a time sink. But don't panic. It's normal. It is part of your practice as a programmer to learn... or else we'd all be stuck with COBOL.

Freelance professionals adjust their commissions accordingly and learning periods is among many other things something that should be factored in to your time estimates. Next time you decide to bring in a new framework, make sure you plan in enough time to learn it.

share|improve this answer

I think you need to worry less about "getting it done properly". Strive for perfection, but realize that it is not really possible to design a perfect solution, even more so the first time round. The fact that you are worried enough about getting it done properly to ask this question means you are already on the right track.

As for your frustration with learning new things, I found that working in a group, and being able to ask and discuss the problem with other programmers removed the pain of finding out what it is I needed to learn, and replaced it with the joy of discovering something new and learning how to apply it.

I love writing software, but sometimes there is indeed pain in not the actual learning of something new, but finding what it is exactly that you need to learn to be able to achieve what it is you want to do.

From what I understand, I have been in a similar position to you. Coding something alone can be both frustrating and difficult at times, and rewarding and somewhat fun at other times.

Do exactly what you plan to do, find a job where you will be a part of a team (and do your best to make sure you land a job somewhere that doesn't suck). Working with other people who use the same technologies and design the same software will expand your understanding and application of those technologies and design patterns almost overnight.

As for knowing how to do something right the first time, well, how would you know there was a better way unless you had already done it a certain way the first time? Skill in software design is often largely dependent on experience. Joel Spolsky is a software genius, but if you read a lot of his articles you will notice that they are very much a result of both experience and intelligence.

As for the SQL part, as a .NET developer I've yet to work anywhere that had a dedicated database developer, we all write our own SQL, but there are often developers that are really good at SQL who are willing to help you out with the more in depth stuff.

You sound like a smart guy, I don't think you should be so hard on yourself.

share|improve this answer

This is totally normal and not something you should be worrying too much about. You do need to continually learn new skills, but you also need to learn to prioritise and manage your time. You also need to avoid the trap of unnecessary redevelopment.

The inexperienced programmer will often get drawn into the redevelopment trap:

I didn't write this program perfectly, and now I need to extend or alter it. It's going to be a lot of work to modify the existing code due to the way I wrote it. I've learnt so much more since then, I'm sure the best thing would be to rewrite the whole program. I'm sure I could write it much better this time.

There are a number of things wrong with this logic.

  • it's a lot of work to modify or add to the existing code, but won't it be a lot more work to rewrite everything?
  • if you rewrite everything there's a good chance you'll make new bugs, & it will take longer than you think (especially if you're inexperienced). Are you considering everything that is involved in writing the system? (remember how long it took you the first time)
  • you've learnt a lot since you originally wrote the program (so you may be able to improve it), but you'll also have learn more next month/year. What makes you think you won't want to rewrite everything again at some point in the future?
  • the ultimate test of a program is that it works. Don't you have anything better to do?

It can never hurt to contemplate and plan for a redevelopment. That means consider how you'd want to rewrite your program, and attempt to identify any problems that you'll hit. In this case you would have identified the 'advanced SQL joins' that you now require, and then investigate how they work and learn about them.

If you think you wouldn't have identified the advanced join knowledge gap through planning (without starting the development) then you need to improve your planning skills. Try to think about which part of the plan wasn't detailed enough. You should go into as much detail as necessary until you are sure that the entire system is technically possible.

This approach will allow you to learn ahead of time.

Finally, learning on the job is a normal part of programming. This does not mean, however, that you start a task and then realise you have to stop for a week to learn about, say, basic HTML. You can stop for a few hours to learn about something, but your employer is only paying you to get the job done. Learn efficiently - don't read the introduction and history, just how it works and how it will fit in to your program. If you have to stop working for days on end to learn how to complete a part of the program, you are doing it wrong.

share|improve this answer

...I decided to rewrite the project using CodeIgniter. I like the framework. But I then got sidetracked because to cut down on my MySQL queries I had to learn advanced joins.

And this is the problem. Whenever I do a job properly I'm in a constant learning wheel. And topics such as advanced MySQL joins take time to learn, and then time to implement...

Well given above I think it makes sense for you to focus on improving your ability to plan ahead, establish and prioritize work queue, manage your time - stuff like that.

Really, this seems to be the only thing missing in your attitude. What you call "sidetracking" is essentially another piece of work ("learn advanced joins") that has to be planned, prioritized and put into queue.

share|improve this answer
    
Thanks @gnat. I really appreciate these positive responses. I can defiantly agree with you on what you said. –  James Guvna Jeffery Dec 28 '11 at 22:32

But, there is a difference between "getting the job done" and "doing the job properly".

No, there isn't, and I think thats the root of your problem here. It seems to me you're too hung up on worrying about doing things 'correctly' because as an individual developer you arent seeing how others operate. But correctly according to who? Who is this magical person who gets to decree that what you are doing is 'correct'? Take 100 of the worlds best programmers, and I guarantee no two will agree 100% on every programming topic.

Ultimately what matters is if your customers are happy. If the programs you create are solving the problems they are supposed to, and doing it in a cost-effective way, you are doing it correctly. It is not more inherently correct, for example, to use codeigniter than to use your own framework. The corollary to that is if you produce a pile of crap, you are doing it 'wrong' regardless of the processes or 'best practices' followed.

That you are revisiting your code and seeing ways to improve it is a normal part of the development process. It is not a sign that you arent doing things 'correctly'. Its a sign that you are dedicated to learning and improving. From everything I see in your post, you have no problem.

Now go kick some * * *

share|improve this answer
    
I disagree with this. There are ways of programming that are much more maintainable and easily readable than others, and there are piles of books dedicated to improving the programmer so that they are able to write better code. –  TehShrike Dec 28 '11 at 22:14
    
Thank you @grandmasterB. TehShrike, and reference to these books? –  James Guvna Jeffery Dec 28 '11 at 22:30
3  
"no two will agree 100% on every programming topic" - maybe, but at least 80% will agree on at least 80% of programming topics. That's the professional consensus. There are no absolute 'rights', but there are best practices and they are worth knowing. –  Kirk Broadhurst Dec 28 '11 at 22:53
1  
All well and good, but if your program isnt solving the problem its supposed to, best practices or not, its been done incorrectly. There is one objective means of telling if a program is done correctly - if the customer hands over green slips of paper or other payment in exchange for your work. Any other measure is simply opinion. –  GrandmasterB Dec 28 '11 at 23:04
2  
And when your client feels your quote for a change is excessive and finds another expert to confirm those feelings because it was poorly coded, you're out of work. –  JeffO Dec 29 '11 at 0:29

To be a professional in this field is to constantly smash yourself up against your own inadequacy. Do that 8-5 Monday through Friday, maybe more if there's a deadline coming up, have a nice weekend, and come back in for more on Monday. That's the job.

Making software requires a certain humility. If you're somebody who has to be right, and who has to prove that they already knew everything, this may not be the field for you.

I can't fathom not learning something every single day. I don't think I'd want that job.

share|improve this answer
    
My experience is that it's okay to be someone who has to be right, as long as you can also stomach failure. I kick myself over every little thing that isn't perfect. That's why i do things better as time goes on. –  Tom Anderson Dec 30 '11 at 12:56
    
Well, that's the paradox isn't it? Hubris is one of the three virtues of the programmer. But in my experience, being "compulsively driven to prove I'm smart by showing that I already knew everything before learning it" is a tendency that rookie developers either let go of, or they don't last long in this field. –  Dan Ray Dec 30 '11 at 16:15
    
Perhaps throttle back rather than let go of? I long ago, fortunately, got out of the habit of proclaiming that i knew things i didn't. However, i still hate admitting to not knowing things; the need to close the gap between what i know and what i want to be able to say i know is quite a driver for me. Not necessarily for everyone! –  Tom Anderson Dec 30 '11 at 20:11
    
I don't know, Tom. Seems to me like that moment of embarrassment that you don't already know something is a moment you could be spending on learning it. I like to know as much as the next guy, but I have no problem at all saying "I don't know". –  Dan Ray Dec 30 '11 at 21:38

What you are going through sounds quite normal to me. This is how we work on our craft and get better and better at what we do.

share|improve this answer

Advice: Don't be afraid of learning new things - you made a good First Step in acknowledging that you could do better and then made the effort to learn how you could do better. Yes, it takes more time up front, but the payoff is usually worth it in the long run. Now that you know CodeIgniter, you can use it for the next future project(s). You can put it on your resume. Now that you know advanced SQL techniques, your future projects will benefit. If you stop learning, you'll stagnate.

share|improve this answer

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