I'm enjoying slowly learning Mathematica but noticing one skill I'm lacking is a comprehensive vocabulary of Mathematica functions. I was wondering if members would mind sharing some strategies they have or experiences they've had about how they expanded their knowledge of Mathematica functions to ultimately be more fluid and expressive in the language. Was it flash cards? A practice website? A pressing project deadline?
I always liked this Wolfram site http://reference.wolfram.com/legacy/flash/
It has the most commonly used functions, and it animates each one also to help learn how it works. Need Flash to run the animations
WolfLang Tip at twitter always have small good examples
Alphabetical Listing of all Mathematica functions
This is actually a decent soft question. I have been doing this for years, and have used most mathematical modeling and simulation products in existence for several years now. While there are times when something like a straight C routine makes more sense for me, I always try to get things done in Mathematica. It is my favorite. I hope you stick with it!
I would say that the best way to expand your Mathematica vocabulary is to do it in time with loads of projects. That is how I did it. When I started, Mathematica was an infant. 3D plots did not rotate. I did not know much either. I copied and pasted and modified functions back then and just played. As an undergraduate math major, I started minoring in computer science, and that broke me into the realization that I could do most things done in other languages here in Mathematica. Well I was always very experiment oriented, and always had things I wanted to do, test, or make, and I just always tried to do it in Mathematica.
I would say the Documentation Center in the help feature has been my biggest help. I think of something I want to do, make, or test, and then work up a pseudocode on paper or in my head as to how I will make it happen. Then I just go for it. Efficiency and code reuse is the order of the day, so typically I will either look for functions in Documentation Center, and I also google for things to make sure I'm not reinventing the wheel. Frequently I am sent to either this site, or the online Mathematica documentation! I put it all together, and when it matters, I try to make it work as efficiently as possible. Sometimes it matters desperately, and those Mathematica functions you're interested in are really the key there to efficiency!
I am tempted to list all of the things I have done in Mathematica, but the list would be broad and too long. It would take me a long time to collect up the list of my random explorations using Mathematica. The craziest part, is that there are so many thousands of functions, it is amazing. Just knowing that the function exists is really valuable, but because there are so many thousands of functions, it is quite impossible to just get that up to speed except by exploration. My advice is to come up with tasks, projects and explorations, and then just struggle to implement them in Mathematica. Use the Documentation Center, and google search always in trying to achieve your goal. Code reuse is paramount, and using the highest level built in Mathematica functions is also paramount. Through time, you will be completing your projects much more quickly, and Mathematica will just become a part of you.
I’ve been using Mathematica daily almost since the beginning, mostly on projects in theoretical physics and quantitative finance.
Some techniques for expanding facility with Mathematica that have worked for me are -
Notebooks are wonderful repositories of knowledge. I keep all the notebooks I have generated in a directory farm that can be accessed with an indexable search engine. If you can just remember a keyword associated with prior work involving a particular function, a search brings up examples of your prior use of that function that you can adapt to the problem at hand. Repetition builds virtuosity.
Over the years I have refined that idea by creating reference notebooks focusing on specific Mathematica operations such as operations on lists, examples of pattern use, scientific visualizations, examples using Manipulate, etc. On the first line of my standard template notebook, I have a hyperlink to a master reference notebook with a menu hyperlinking to the various reference notebooks. When faced with a situation involving some infrequently used function I can, with a few mouse clicks, see examples of how I and others have used that function. In my experience, when you think about using an unfamiliar function, coming up with the required syntax is one of the main obstacles. Having examples of proper syntax at your fingertips helps overcome that problem.
In retirement, I have had the time to start editing my notebooks and publishing them on a personal website. Check my profile for the location - hope something is useful for you.
Saving old work helps but from the standpoint of expanding Mathematica vocabulary, probably the most productive thing I have done is to study closely the work of Michael Trott. By analyzing the code in his masterful Mathematica Guidebooks, I have learned so much. I analyze, deconstruct and re-express his methods in my own notation/style, which is typically much more verbose. Tight code and short hand notations may be elegant and efficient but, in my case, saving mental cycles is more important than saving CPU cycles.
Finally, Stack Exchange is quite useful. Some very good Mathematica coders frequent this site, and you have the added advantage of hearing them motivate the reasons for their design choices.
After thinking about it I do have a short answer that should probably be included here for students. It's appropriate to suggest An Elementary Introduction to the Wolfram Language. The 2nd edition notebooks of which I worked through about 80% of the content I was interested in. I would recommend it for people trying to get a head start on learning the language or were self-directing their efforts like myself.
I know it's cliche but when I first started (and I'm still a beginner) I found the sheer number of functions and the myriad ways of solving problems was paralyzing. I set myself the goal of learning 100 functions that could get me through most scenarios for a beginning uni STEM student ie, assignments and lab reports. Then I made cue cards each time I found something on-line that seemed really generic and drilled them until they became routine.
This has some odd side effects that you should accept up front ie, you find some round-about ways of doing things that you get used to and then find more elegant solutions over time. So long as you're aware of it, it's not a big problem. For instance, I find the use of
Table is a generic workhorse function for checking things in a list and then using
Select with a simple T/F criteria - it's long winded, wasteful and hardly elegant but it almost always works. Once I got bored with typing, I was far more open to say, pattern matching using
Cases and getting the answer directly.
The other thing I've found really useful is to create an inner narrative that translates easily into code ie,
/; means 'whenever' and
-> means 'and set it to'. I use mental models similar to to the flash animations above to visualise what the function will do -
Fold didn't make any sense to me at all until I'd figured out a way to do it with paper and pencil. Many problems seem to become quite trivial if you are able to translate them into words/phrases that feel natural to you and use the correct function name - I am starting to appreciate the naming conventions in WL more and more as I practice this.
100 functions isn't that many to shoot for and now that I can find a way to wrangle some sort of answer I'm able to ask better questions and able to actively use the documentation. The See Also sections are always worth exploring.
I wrote myself a guide as a learning project - you're welcome to a copy if you want but it's not the sort of thing that is on-topic for this site. I think I uploaded a copy here and on the Wolfram Community site so it's pretty easy to find. In general, forcing yourself to write "the introduction that you wished you could have started with" is often a good first project ;-)
BTW I think this is a generic problem with learning (any) language - if you are interested in creating an on-line peer study group I'd be interested.