Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians.
--E. W. Dijkstra
Is math programming?
It's math in the sense that it requires abstract thought about algorithms etc.
It's engineering when it involves planning schedules, deliverables, testing.
It's art when you have no idea how it's going to eventually turn out.
As a mathematician trying to plug problems with solutions, I am constantly challenged in maintaining and growing my portfolio of tricks so I can a method to solve any specifiable problem. The beauty of software and open source collaboration is that I don't have to solve the same problem twice. Once the software is written, I can share the library and move on to new challenges.
I mainly operate in the domain of logistics where the atomic unit is a box, so it may surprise you how difficult it is to prove that there is no better way to run a supply chain given a systems' variety of orders, products, mechatronics, operating costs and constraints of scheduling. Here's a flavour of a what I can meet on a typical week:
With challenges spanning such a broad range of topics it is no surprise that noone will ever know it all. The theoretical fields of mathematics such as graph-theory, relational-database-theory, set-theory, and game-theory interweave with more application oriented fields such as mixed integer and linear programming, discrete event simulation, decision analysis under undercertainty, materials requirement planning and scheduling. Most academics would refer to this intersection of topics as "classical operations-research" but I would like to throw a "modern" nuance into the equation: We solve problems using programs. As the simplicity of the textbook solutions easily can be dismissed as overly simplistic, the next - and somewhat obvious - step is to debate what good libraries are to solve some of these problems.
Due to the nature of the work, I'm very fond of the hands-on appraoch to learning:
Start with basic processes - e.g. learn to solve problems with Python including:
Learning to communicate what you know is equally important, so learn to use jupyter notebooks with markdown and mathjax *
A final note is that I would recommend to use VScode as the IDE, although this is a personal choice. Don't try to code in nodepad++
as it will leave your productivity at 1/10 of everyone else around you.
Learn popular tooling - e.g. batch processing using numpy, scipy or incremental processing using graph-theory, tablite. Learn also how to exploit sympy for solving equations and how to manage workflows with github.
These packages are dominantly "batch processors", which mean that they consume a complete set of inputs and returns a result. This is in contrast to "incremental processors" where algorithms react to or propagate changes in a "virtual world". The difference between batch and incremental is very important as most modern OR-analytics is batch based, whilst most planners and controllers will be incremental. I won't dive deeper into this, aside from mentioning that batch-based optimization often require total control of the system in scope, where the reality in logisitcs often is more akin to a negotiation over committed and uncommitted time horizons.
Really understand the fundamentals - e.g. profiling, parallel processing. If you've reached this level of understanding you have probably exhausted all options above. You've tried and tested well known solutions to problems and you are stuck. This level is about learning how to make yourself "unstuck" and knowing the difference between optimum and satisfycing.
If optimization is where you feel your strengths live, then puLP and scipy.milp are mandatory. Having written genetic algorithms from scratch, confidently be able to construct an evaluation function for the state of a system and knowing how to exploit parallel programming to explore large solution landscapes in a coordinated manner are lessons that you will have struggled with and now appreciate.
If statistics is where you feel your strengths are, you must know about the fast fourier transformation. You may wonder "but why?" The FFT is such a strong tool for abstration of both discrete and continuous probabilities that there's no way around it.
If Agent-based system design is your forte, the maslite must be no.1.
If network analysis is where you find the most interesting challenges, then graph-theory and networkx are mandatory.
Specialize - e.g. commit deep focus on solving fundamental problems.
You are now onto new horizons. There are no textbooks, so all that I can recommend is to engage with the special interest groups (SIG) on the topic. You're now on your own!
Again the list above is not an exhaustive list of answers. It's a hint that has matured over the past 20 years of career. I recon it will mature more.
/B