I'm not a hiring manager, but if your self-description is accurate (see comments re: impostor syndrome for the possibility it isn't), I wouldn't want to work on a team with you. The problem doesn't seem to be that you're not smart or technical or industrious enough, but that you're not conscientious enough:
I figure out what needs to be done in order to get something to work reasonably well, and if I can’t do it myself I google it till I find snippets of code that mostly do what I need, then I modify them and hack around till I get something that works decently enough.
To me this is a much bigger problem than your ability to implement a linked list or describe big-O notation -- I'd be worried that I'd always be cleaning up after your messes.
The good news is that this is a solvable issue. Start collaborating with people, maybe via open source. Find a project of yours that's useful but maybe not profitable, open source it, and start handling requests for features and submissions. Learn how to deal with bad incoming code, and how to deal with your code being confusing to other people. Maybe read some of the classics on code as collaborative effort, like the Pragmatic Programmer or Clean Code.
Or maybe just decide that this isn't for you! There are lots of jobs oriented around achieving specific goals with throwaway code that you might be happier in than being a slave to the CI server, and they aren't less valuable. But if you want to be hireable in a code-oriented company, I think you have to change some things.
"There are lots of jobs oriented around achieving specific goals with throwaway code that you might be happier in than being a slave to the CI server, and they aren't less valuable."
Hi, would you mind elaborating on this? I am a self-taught coder since this year with exactly one webapp project to show. I'm in no position to say for sure, but I think I would enjoy writing throwaway code more than highly technical code. That is, getting stuff done is more satisfying to me than the nitty gritty details. If left on my own I'd probably develop into a coder with a portfolio much like the OP. I think we're more interested in what we could do with code, than the technicals of it. So I'm wondering what kinds of jobs out there for people like me, or am I looking at building small but profitable projects to make a living. Thanks.
Edit: If it matters I have an engineering background (MSEE) and can understand some of what's going on under the hood. If I had to pass a CS exam I would just cram like for any other test. But, I found I'm more motivated by the business end.
Unfortunately I don't think I'm familiar enough to recommend a particular path, but I know that I run into lots of people at programming meetups and elsewhere who write code in their day job but it's not the finished product they're delivering. For example, working for an environmental sciences consulting company where the finished product is a report on arsenic levels in water, you might write a Python script to collate data for presentation, or a quick one-off web service for people to submit data to. In these cases, I think you'd need to develop some domain knowledge first, but with an engineering background, you should have access to a fair spectrum of possibilities.
As some other commenters have mentioned, and I've experienced myself - there are a lot of "small but profitable projects" in the internet marketing and advertising space. The best approach might be to join or partner with an online marketing agency. They often have customers who want more than a simple web page, for example a Facebook game to go together with an advertising campaign.
That said, most software engineers in the world do not work for big-team, Computer-Science-heavy software companies. They work everywhere building internal software to support the business in various other fields. However, finding or selling to these companies might be more difficult as an individual freelancer, as they might not even realise that their work could be optimised with software.
It is worth your while to learn OOP if you haven't and at least some of the technical stuff. I am a lot like you, engineering background as well.
However, if you try to just freestyle even a medium sized project without any knowledge it will become unmanageable in only a few months.
Most things you can just learn to do by doing plus some google, but there are better ways to do a lot of these things and you should at least try and do something like program chess in C++/C#/java/obj-c with OOP and inheritance. It will significantly speed up your ability to do subsequent projects and increase the scope of projects that you are capable of doing.
Thanks for the advice and I agree with the chess idea. I'm familiar with OOP but my usage of it is very loose. Especially since my webapp is mostly, "if this happens, do this." The only objects I really created were to store into the database. I have learned Java at university 10 years ago (Python and Javascript self taught), so OOP was what I learned from the start.
Agree on all of these points. In addition, knowledge of basic algorithms and data structures can give you a baseline for communicating with others in your field, which can be important if you're working on a big project with lots of other people with different backgrounds.
If you've been doing this for as long as you have, then this wouldn't be hard to pick up. You can try going beyond the "Learn Ruby|Python|FooBarBaz" stuff and take an online course in algorithms. You might find there is a whole world of stuff in computer science that could be up your alley if you dip your feet into it, and it would be all the difference between the how you do what you do, and the why.
I figure out what needs to be done in order to get something to work reasonably well, and if I can’t do it myself I google it till I find snippets of code that mostly do what I need, then I modify them and hack around till I get something that works decently enough.
To me this is a much bigger problem than your ability to implement a linked list or describe big-O notation -- I'd be worried that I'd always be cleaning up after your messes.
The good news is that this is a solvable issue. Start collaborating with people, maybe via open source. Find a project of yours that's useful but maybe not profitable, open source it, and start handling requests for features and submissions. Learn how to deal with bad incoming code, and how to deal with your code being confusing to other people. Maybe read some of the classics on code as collaborative effort, like the Pragmatic Programmer or Clean Code.
Or maybe just decide that this isn't for you! There are lots of jobs oriented around achieving specific goals with throwaway code that you might be happier in than being a slave to the CI server, and they aren't less valuable. But if you want to be hireable in a code-oriented company, I think you have to change some things.