Sometimes it is that we know our own limitations, and sometimes it is that we have an unreasonable sense of what constitutes competence. How do we tell the difference?

A few posts ago, I talked about not being a software engineer... yet.

Yet when I set out to close some of those gaps, I realized how much I already know about all this. I'm at some vague intermediate stage where I know several languages at a functional level, some basic data structures, and some concepts about how to break down problems, but I suspect that all my code looks a bit odd.

There are conventions in each language, cultural expectations about when to use a while loop, and when to use until. Whether you use at all, even if it is possible in principle. Maybe you are expected to use case structures instead of if...then...else. Each language produces code that looks familiar to an expert in that language. My Rails code, even though it conforms to the MVC approach, doesn't quite read like Ruby.

Most of my work has been patching things on exiting code. Any time I had to make a modification, I used whatever language the project was already written in... python, php, MivaScript, ColdFusion, Ruby, FORTRAN, COBOL, logo, BASIC, and once, very awkwardly, perl. (Perl is really weird.)

I know that I need loops. I need logic. It also needs to be finished yesterday... maybe we'll go back and figure out the vagaries later. (There is never time to go back and figure out the vagaries. This is what we call, "technical debt.")

And thus, as I said, "I can make the code work, but I'm not confident about how well it will stand up in the wild."

I'm not entirely sure, though, that this makes me all that different from a lot of the people who are working in this field. Is the problem that I don't know what I'm doing, or is it that I know when I don't know what I'm doing?