I have until September 20th before school starts back up again. I’m a college student pursuing a major in Chemical Engineering. Instead of wasting my time at home I’d like to learn something valuable, the only issue being I’m not really sure what to do.
I am leaning toward learning to program. I’m given the impression that this is a valuable skill in engineering disciplines. I don’t have much experience besides a class is java, but I find it’s pretty interesting.
If I do try to learn programming what language should I pursue? What would be the most valuable? What resources should I refer to? Preferably, I would like to be able to pursue the beginning steps without making a financial investment.
Java is the main language in academia, and since you’ve already taken a class, you can improve your understanding of it. In fact, the Chemistry Development Kit (here) is written in Java.
There are plenty of free resources. For starters, you’ll need a Java Development Kit (JDK), which you can download here. For actual coding, you can use a super text editor (I recommend Notepad++) or a full integrated development environment (I recommend Eclipse).
To learn the theory and practice of Java, I’d recommend Thinking in Java, which is freely available online, or the Java tutorials here.
I agree that it is very useful to learn a scripting or programming language, but I would have to strongly disagree in selecting Java for that purpose. Java’s strengths are in generating professional-grade web and cross-platform applications; however, it carries both a heavy overhead in the Java Virtual Machine, and has a fairly steep learning curve. It doesn’t give you quite as much rope to hang yourself as C++, but while a real pro can knock out Java code pretty quickly, if you just want to do something quick and dirty, like parse a data set and run it through multivariate statistical regression to fine trends or do some visualization, you’ll end up spending more time writing code and fiddling with the environment than manipulating data, and that way lies the dreaded all-nighter.
I would suggest learning a general purpose scripting language like Python, which is both faster to run, easier to learn and read, and has a large number of open source libraries dedicated to statistical analysis, linear algebra, general purpose visualization, and various computational chemistry applications. Using numpy, pylab, matplotlib and scipy give you virtually all the functionality of commercial general purpose solver/data reduction codes like Maple or Matlab, and it has libraries like rpy and gnuplot-py that let you leverage off of existing and widely used open source data manipulation and visualization packages (in this case, the statistical package R and the visualization tool gnuplot). I don’t know about the chemistry and chemical engineering field, but there are a number of pre/post-processing tools and solvers in finite element analysis and computational fluid dynamics that have bindings specifically for Python. Being an interpreted scripting language, it is also possible to use Python as a simple interactive calculator as well, similar to Matlab or Maple, whereas using a true programming language like Java requires writing at least as header, object declaration, and variable typing. You can also use existing Java libraries with Jython or JPype. You can probably use Ruby in much the same way as well, although I have only a passing familiarity with Ruby. I have a number of current and heritage tools that I use at work that are written in a combination of Matlab and FORTRAN; if I were going to rewrite them today I would definitely use Python and its libraries.
I don’t mean to rag on Java too much; it’s a suitable language for the type of applications it was designed for, but it also carries a lot of baggage with its enforced object oriented, declared type paradigm. You can make some beautiful professional-grade applications on it, it is at least someone less painful to cope with than C++, and after a few years of coping with a pretty suboptimal JVM it is now reasonably lightweight and a good way to port applications from one platform to another with minimal manipulation of the source code. But it is a language constructed by and for real programmers, not for engineers and scientists whose first priority is crunching data, and for whom following good programming practice is a distant second. For the engineer, Python is nice in that it lets you do a lot of cutting of corners and avoiding the sort of deep thinking about how to structure and algorithm, while at the same time doing a reasonable job of enforcing good formatting practice (a terrible failing of perl, which really should be relegated to being a text-parsing script).
Oh, and while there are plenty of excellent resources on the Web for learning to script in Python, once you get into scipy and numpy, I highly recommend A Primer on Scientific Programming with Python. I’m working my way through this now in my infrequent spare time, and it is an excellent tutorial once you’ve mastered the basics of Python.