Wow, this thread is incredible! Thanks tsaishen for your reply, it is truly great stuff, and I was able to deduce invaluable insight from it. :-) Thank you Thom and Bytemaster for your advice as well.
I am interested in programming AI and will be pursuing that once I've gathered the more basic of skills. I think C++ is probably the right tool for that application. I'll check out css, html, and Java per your recommendation
It depends on what you're trying to actually accomplish with AI. C++ has several good libraries so I wouldn't count it out.
But the type of AI relevant to cryptos, finance and trading is in my opinion better handled by languages designed specifically for AI.
There are a few, LISP comes to mind which oddly enough someone was just asking about Clojure which is a LISP variant, so maybe that's a good choice. Never actually used it though so YMMV.
If I were building an automated trading system, I would use machine learning framework with a language I already know. Hadoop has a sub project called Mahout that provides an excellent basis for building a "smart bot" and it's Java so I don't have a learning curve there and I can acquire talent easy enough.
https://en.wikipedia.org/wiki/Apache_Mahout The nice thing about building on top of this is instant scalability. You have a problem that parallelizes well? Spin up 10,000 nodes and be done in a few seconds instead of a few days.
I wouldn't discount OpenCV though especially for computer vision related AIs, it's C++ but has bindings for a number of languages.
When I select a language for a task I have a little mental flowchart I use so I can limit my choices rapidly and start focusing on the problems at hand. I'm sure everyone else who has done this for a living follows a similar process.
#1 Identify the problem. This literally means "Ask questions and break things down until the answers become blindingly obvious."
#2 Select the problem domain. Is the project user facing? Is it a server that needs to run reliably for years? Is it something just needs a quick run once in awhile?
I literally found myself stepping into a project once that had 3 years of development time under the previous manager.
It was nowhere near completion but we managed to complete it overnight.
I was able to do that because up to that point, none bothered to notice the underlaying task could be run as a perl 1 liner on an hourly cron job. They had built this huge framework with Spring & J2EE on JBoss, but missed something totally obvious.
They were looking for a programmatic Java based solution, when they should have asked the server admin to script the 1 liner and add it to cron.
So make sure you fully understand the problem domain & requirements before you try to look for solutions.
#3 Design a solution. Again this is asking questions like, what resources do I have? what tools can I use? There are so few "actually novel" problems in comp-sci. Someone has probably solved your problem before, you should look to leverage their efforts. Many time a "glue it and go" will provide a better solution than "coded from scratch". Furthermore, it's been my experience that the best language for a particular job comes down to "What languages does my team already know". Unless you are choosing something highly esoteric, most times there's a library out there for any given language that already gets you 90% of where you want to be. You should just pick the language that your team is most comfortable with and roll with that. Same with DBs and even OSs.
I saw a really great company completely and epically fail because they decided to move from MSSQL to PostGres. It was a cost saving move, but none of their software knew how to talk to it and their DB admins were MSSQL Certified with no clue about how to deploy PostGres. By the time they caught this, they had already burned bridges with customers due to downtime.
In otherwords, the most epic flaming sword is of no use to you and might be dangerous if you work in a paper factory.
#4 Create a validation framework. This means answering the question "How do I know that number 3 solves number 1 without creating new problems?" For many people this means you start by writing a test harness and crafting individual unit tests. If you do this before you ever write a single line of actual functioning code. Your code will self validate. It either builds and runs, or you get lots of screaming red lights on your build tree. If you do this, please learn to commit your code for the entire week before lunch time on Thursday. If make your team work late nights on Friday and Saturday you will become a pariah, quickly...
I'll let someone else add their horror story here.
I tend to take Fridays off and turn off cellphones and emails after 5 on Thursday for this specific reason.
#5 Start coding. You've identified that there is a programmatic solution to #1 that requires you to either write something from scratch or create some glue code to stick some existing frameworks together. You've created a way to verify that your solution actually solves the danged problem. Now you need to do the leg work to finish up. This is actually these easy part. Relax and enjoy yourself.
#6 Test, test EVERYTHING. Check that each function you wrote returns correctly, not only in the common cases, but at ALL the edges.
Try to imagine the worst possible way your code could fail (probably should have started doing that during #5 BTW), then realize that you are an idiot because you will always miss the obvious. If you didn't realize that by now, reality is going to slap you upside the head really, really soon.
Here are some reality slaps, just off the top of my head.
Actual things that can really happen...
You have a trading bot that sees a trade of 1 BTC for 0.001 USD. What happens?
You need to track BTC vs BTS values, but BTS is now showing less than 1 satoshi, how does your software react?
You used INTs for your INT values and now you are dividing in a what?
Uhh where the hell is that 0 coming from? (Might be a Java specific issue)
You used a 32bit float to represent an INT value, now you have 5 billion ints, do you even know if the value is now positive or negative?
What happens when one or more of your counters roll over?
Yes test everything! Also verify that all your assumptions are correct. For instance if you are pricing from a price feed and the feed goes down, do you suddenly begin to price things to 0, or do you pause until the feed returns or switches over? Are absolutely sure about that?
If there is a panic, or an exception don't ignore it and
please don't just log it as
"Ok something happened, but it's alright because this can't ever occur" or even worse...
//This line of code will never be reached
And for the love of God don't be this guy!
*blockchain.info I'm looking at you*
#7 Give it to the user, have them help you identify new problems and repeat steps #1 through #6
#8 Maintain it, i.e. GOTO #1