First, I'm surprised about the suggestions of formal education. I figured programming and freelance work was past that mentality. More of a show us your capabilities and if we need your services we can discuss compensation type job market.
It depends on two things: the job market and the kind of work you want to do. Sure, during the dot-com bubble startups were (insanely) falling over themselves to hire high-school kids who "knew HTML," but the job market is not like that anymore (at least outside of Silly Valley; there might be some of that insanity going on there). Also, if you do find a company willing to hire you with no formal proof of your skills, you have to consider whether that's the kind of job you want. The jobs where they don't care tend to be the ones offering only boring, simple grunt-work (the kind that gets outsourced to India, sooner or later). In civil terms, they're draftsman or construction jobs, not engineer jobs.
Jack I really appreciate your feedback. I completely agree that I should try to leverage my engineering knowledge, degree, and experience. It only makes sense that the more specialized and unique my experience/knowledge the more valuable I can be. I know the pay would be greater as a skilled software engineer with civil engineering knowledge than as a civil engineer. So do you think python is not a good place to start? Do you ever miss the engineering to create physical objects vs software?
Python is a decent place to start, but it probably won't be the place to finish. My company's software, for example, makes Python available as a language for writing plug-ins, but the core of the program (and any non-trivial plug-ins, for that matter) is written in C++. The same or similar will be true for every other engineering software. If you're really unfortunate, you might end up somewhere where they still write in Fortran or Ada (but the latter is more of an aerospace CAD thing)...
Of course, thinking of programming in terms of which language you know is entirely the wrong mindset anyway. That's like a civil engineer asking "so should I learn the metric system or imperial?" It doesn't matter; the concepts are what are important and they can be expressed in any language. It's just that some languages are more well-suited for the task and/or more commonly used than others.
In other words, you should not ask yourself "what language should I start with?" You should ask yourself "what concepts should I start with?" and then pick a language that least gets in the way of learning those concepts. It's only for that reason that Python is a common recommendation: unlike C, you don't get bogged down in pointers and memory management, and unlike Java, you don't get bogged down in 'enterprise-y' object-oriented boilerplate. Matlab/
GNU Octave or
Scheme are also reasonable choices for first language, but Python is the most generalist and widely-used of the three. Later, when the answer to "what concept should I learn next" is "high-performance parallel or distributed matrix solvers" (the core of structural analysis software), the "language that least gets in the way" will no longer be Python.
And no, I don't miss creating physical objects. First of all, I spent time in operations and in design, but not in construction -- so I never actually saw anything I designed get built anyway. (I suppose some of it probably exists by now, despite the fact that lead times are really long for highway projects, but I've never visited the sites to see.) Second, one of the great things about programming is the instant gratification of writing something, hitting "run," and immediately watching it work (or fail to work...!). It's much more (virtually) "hands-on" than handing off a drawing to somebody else.