It’s had an impact on software for sure. Now I have to fix my coworker’s AI slop code all the time. I guess it could be a positive for my job security. But acting like “AI” has had a wildly positive impact on software seems, at best, a simplification and, at worst, the opposite of reality.
I feel this article's argument is weak, largely for one key reason: They don't clearly define anything. Their references might clarify some things, but not all. They argue against "general problem-solving strategies" with a reference to Polya, but they don't provide a clear definition of what these strategies entail. How broad is the set of strategies they're arguing against? What are some examples of such strategies? I'd like something beyond two sentences on Polya.
Furthermore, what audience and level of mathematics education are we discussing? The goals (and hence appropriate metrics of success) are certainly different for high schoolers targeting non-STEM careers vs. engineering undergrads vs. math grad students. The authors reference "aspiring mathematicians" and "domain specific mathematical problem-solving skills", indicating they're arguing about education for math majors, or at least students in STEM fields. In that case, the argument is somewhat meaningless - who's arguing math majors shouldn't learn math-specific skills? But, as I understand it, the argument for general problem-solving skills is that students outside of math don't actually need many specific math skills. Instead, math is a vessel for teaching logic, reasoning, and problem-solving skills. Then again, this might not be the type of problem-solving the authors are referencing - as I said above, it's not very clear.
On a similar note, they cite evidence that studying worked examples is more effective than "general problem-solving strategies", citing an "improvement in subsequent problem-solving performance" without explaining how this performance is measured. If students are tested on specific problem types, of course they'll perform better when taught strategies for those specific problem types. But it's not clear that this is meaningful. For STEM majors, sure, solving specific problems is a skill worth cultivating. But for most students, solving specific problems isn't as important as learning logic, reasoning, and general problem-solving skills. In my anecdotal experience tutoring math, students tend to just memorize strategies for specific problem types instead of learning transferable logic and reasoning skills because that's what's tested. I'd be curious to see which method of learning facilitates better performance on a more general problem-solving test of some sort.
Now, I'm not an education researcher or an educator of any sort. But I am passionate about good STEM education, especially in math. I genuinely feel that math education fails most students, at least here in America. If I'm being generous, this article is a well-intentioned but poorly-executed argument for effective math education strategies. If I'm not being so generous, this article advocates for the status quo in math education that forces students to slog through years of math classes for little discernible benefit. Either way, it's a disappointing article with a poorly-explained thesis.
> Furthermore, what audience and level of mathematics education are we discussing?
I wonder this too, I think they might mean university-level as well. For younger audiences, I feel one of the biggest problems for most people to understand math is they don't understand why any of it is relevant. If educators can make it seem more like teaching general problem solving abilities, that will likely improve the overall acceptance and lead to better overall math skills as a result.
As a specific example, our high-school math curriculum taught a lot of calculus, but framed it incorrectly as being a useful tool that people would use. Eg as if a business man would write down an equation for their revenue based on inputs, and then take the derivative to compute the maximum. I'm assuming they told students this to try and get them motivated, but it clearly was a lie since everybody knows you could just plot a graph and look at it to find the maximum. If they instead were honest that the point of learning calculus was to help with understanding more advanced concepts in math/engineering/science, while also being a valuable learning tool for general problem solving, I think that would have been a better result.
> As a specific example, our high-school math curriculum taught a lot of calculus, but framed it incorrectly as being a useful tool that people would use.
One day at FedEx the BoD (board of directors) was concerned about the future of the company and as part of that wanted an estimate of the likely growth of the company.
In the offices there were several efforts, free-hand, wishes, hopes, guesses, what the marketing/selling people thought, etc., and none of those efforts seemed to be objective or with a foundation or rationality.
We knew the current revenue. We could make an okay estimate of revenue when all the airplanes were full. So, the problem was essentially to interpolate over time between those two numbers.
For the interpolation, how might that go? That is, what, day by day, would be driving the growth? So, notice that each day current customers would be shipping packages, and customers to be would be receiving packages and, thus, learning about FedEx and becoming customers. That is, each day the growth would be directly proportional to (1) the number of current customers creating publicity and (2) the number of customers to be receiving that publicity.
So, for some math, let t be time in days, y(t) the revenue on day t, t = 0 for the present day, and b the revenue when all the planes were full. Then for some constant of proportionality k, we have
y'(t) = k y(t) (b - y(t))
where y'(t) = dy/dt the calculus first derivative of y(t) with respect to t.
Seeing how the growth goes for several values of k, pick one that seems reasonable. Draw the graph and leave it for the BoD.
That was a Friday, and the BoD meeting started at 8 AM the next day, Saturday.
First thing at the meeting, two crucial BoD members asked how the graph was drawn. For several hours, no one had an answer. The two members gave up on FedEx, got plane tickets back to Texas, returned to their rented rooms, packed, and as a last chance returned to the BoD meeting. FedEx was about to die.
I did all the work for the graph, the idea, calculus, arithmetic (HP calculator), but didn't know about the BoD meeting. Someone guessed that I did know about the graph, and I got a call and came to the meeting. The two crucial BoD members were grim, standing in the hallway with their bags packed, and their airline tickets in their shirt pockets.
I reproduced a few points on the graph, and FedEx was saved.
Interesting, but I still think most problems like that are solvable via Excel. Put some formulas in some cells, tweak some variables until you find a way to maximize something. Possibly use graphs or pivot tables or other advanced features to help if needed.
Once you’ve figured out the solution, then you build a pretty graph for the BoD proving it. Make sure to keep the spreadsheet around as evidence.
Sure, for some applications of calculus
can use just discrete steps. That is,
instead of the calculus dy/dt just use
something like (y)dt.
Then, for the arithmetic, some code can be
short and, compared with cells in a
spreadsheet, easier and with more control
over the time steps, e.g., in Rexx with cf
for customer fraction:
Say ' ==== Growth ===='
Say ' '
Say ' Customer'
Say ' Year Fraction'
max_years = 5
steps_per_year = 10 * 365
cf = 1 * ( 1 / 100 )
year = 1
k = 1 * ( 1 / 2000 )
Do Forever
Do i = 1 To steps_per_year
cf = cf + k * cf * ( 1 - cf )
End
Say Format(year,9) Format(100*cf,10,2) || '%'
If year = max_years Then Leave
year = year + 1
End
So, get a 'lazy S curve'. I've since
learned that the curve has a name, the
'logistic curve'. And, right, can also
consider that curve for other cases of
growth, e.g., for a first, rough estimate,
COVID.
Adjust some of the constants in the
program and can get more output, say, for
each month, day, etc. The code above uses
10 steps per day.
For more, someone could use the calculus
solution and compare.
In a sense, for the FedEx problem and the
assumptions about what was driving the
growth, the calculus solution is a
smooth version of the somewhat more
appropriate discrete time version.
But when I did the calculation at FedEx,
my best source of arithmetic was an HP
calculator in which case the calculus
solution was a lot easier.
Of course, this FedEx calculation was just
one example and there are many others.
My view from 10,000 feet up is that in
business, at times some math can be an
advantage if not the work of a steady job.
If some math is an advantage, then that
advantage tends to go to the owners of the
business. If a mathematician wants to get
paid for some math they have in mind,
maybe they should start a business and be
the owner.
Godot is easily my favorite game engine. The node system is simple yet powerful, truly a joy to use. For the most part, I feel like I have a good level of control over my projects without having to get too low-level. It doesn't feel like I have to organize my code around the engine's architecture, like with Unity or Unreal. Godot is also free and open-source and very lightweight. Support for C# and 3D has been improving, especially with Godot 4.0. And it has pretty good cross-platform support.
I recently read "Enabling tabular deep learning when d ≫ n with an auxiliary knowledge graph" (https://arxiv.org/pdf/2306.04766.pdf) for one of my graduate classes. Essentially, when there are significantly more data points than features (n >> d), machine learning usually works fine (assuming data quality, an underlying relationship, etc.). But, for sparse datasets where there are fewer data points than features (d >> n), most machine learning methods fail. There's just not enough data to learn all the relationships. This paper builds a knowledge graph based on relationships and other pre-existing knowledge of data features to improve model performance in this case. It's really interesting - I hadn't realized there were ways to get better performance in this case.
My thoughts exactly. The author seems to think a proprietary period is the best option. But honestly, I'd rather have data be immediately openly available and ensure we credit those who played an important role in identifying what observations should be made and obtaining the data. That really seems like the best of both worlds. Promoting open access to data and collaboration among scientists is better than promoting closed access to data and "scooping" of results/limited collaboration.
Writing blog posts has been in my back-of-the-mind TO-DO list for a while now. I just never seem to have time for it. Or rather, there are a million things I end up prioritizing over blogging. One of these days, when I'm less busy, I'll start writing some blog posts. I definitely have some ideas for posts that I think could be interesting.
But reading papers is fun and cool. You get to learn new things. If you read recent papers, you learn things that aren't just new to you but new to the entire world; you can literally learn cutting-edge things that were discovered recently. And if you read older papers, you can better understand why the world is the way it is right now.
Putting TC aside (don't most programmers make plenty anyways?), isn't it just cool to learn new and cutting-edge things? Personally, I think so. Curiosity is central to what it means to be a hacker.
Very interesting paper! It's cool to see that Fortran is still evolving. I've been considering learning it (when I have the time) because of its use for numerical computations and parallel processing. I feel like there's been a big push towards general-purpose languages like C++. However, I'd love to get a better feel for what it's like to program in a language specifically designed for your use case. The closest I've experienced is MatLab, but I feel like MatLab is designed more for scientists and engineers who need to perform some calculations but don't want to actually learn how to program, not for professional programmers working on scientific computation.
I don't think there's much in Fortran that's still unique or "specifically designed" for numerics compute. General purpose languages reached parity with Fortran a long time ago. And "general purpose" typically wins anyway because it has the larger and more diverse ecosystem.
Most of them did not reach parity, at least not in performance. The fast languages are C, C++, Fortran, and Julia. Those are the only ones used for teraflop computing. Fortran is a great tool for scientific computing, but for new projects, where you are not extending an existing code base, Julia will be much more fun in every way.
I don't think Julia belongs into the same list as C++, C and Fortran. It is true that for some algorithms it is almost the same speed as C++ out of the box, but for many others it is still factors of 10s or 100s of. Also it often requires significant tweaking to get to it's best performance (e.g. don't use abstract types), so it is almost like saying Python is the a fast language, because you can use Cython or Pythran. I really wish Julia fans would stop overstating the language capabilities, it really does a disservice to an otherwise great language.
There the "naive" Julia code, simply implementing the code like I would in Fortran is a factor of 10 or 15 slower than the optimised cython version (which would be the same as a regular C version), the optimised Julia version is still a factor of 5 slower than the cython and pythran version. Can you show me how to optimise it so that Julia performs on par with pythran or cython?
The naive Julia code made a few pretty fundamental mistakes (Complex vs Complex{Float64}, and row vs column major). The following is non-optimized Julia code that is roughly 6x faster (and much simpler) than the "optimized" code in the blogpost. Some further optimizations would give another 2-4x over this (like using StaticArrays), but I'll leave that as an exercise for the reader.
apply_filter(x, y) = vec(y)' \* vec(x)
function cma!(wxy, E, mu, R, os, ntaps)
L, pols = size(E)
N = (L ÷ os ÷ ntaps - 1) \* ntaps # ÷ or div are integer division
err = similar(E) # allocate array without initializing its values
@inbounds for k in axes(E, 2) # avoid assuming 1-based arrays. Just need a single inbounds macro call
@views for i in 1:N # everything in this block is a view
X = E[i*os-1:i*os+ntaps-2, :]
Xest = apply_filter(X, wxy[:,:, k])
err[i,k] = (R - abs2(Xest)) \* Xest # abs2 avoids needless extra work
wxy[:,:,k] .+= (mu \* conj(err[i,k])) .\* X # remember the dots!
end
end
return wxy, err # note order of returns, seems more idiomatic
end
These comments seem out of date. There hasn’t been an issue, really, with breaking code for quite a while, since 1.0. They also show a lack of understanding in some respects, for example complaining about the hello world memory usage. Running a Julia program in the usual way loads the runtime.
For another take, Jack Dongarra was just awarded 2021 ACM Turing prize. He’s the creative force behind LINPACK and BLAS, and says that Julia is a good candidate for the “next computing paradigm”: https://www.zdnet.com/article/jack-dongarra-who-made-superco...
Some of the comments (in the original link in your parent comment) are pretty weird:
> I sometimes wish [Julia] had just appeared one day as version 1, and made periodic updates every year or three.
> Its “multi-paradigm” nature. Yeah, I know other languages have this too, but it does tend to bloat a language.
And some are just funny:
> The language is not stable, and by that I mean it seems to have a lot of bugs [links to github issues with label:bug]. You can’t really call something that has bugs stable.
Yeah. Of course there are bugs, but none of them are serious. Julia is still a young language, but it’s rock solid and used in high stakes, high performance computing in industry, government, and academia. Like I said, there are only four high-level languages that can perform at this level. Julia is certainly the most advanced and interesting of these, and, yes, it’s just a lot of fun to use.
Seems highly subjective and not in line with the experiences a lot of the rest of us have. Stuff just suddenly breaking in old code with new compiler?!
No, that is not a common thing post Julia v1.0.
A lot of newer libraries are not well documented in Julia, but the core stuff is much better documented than Python IMHO. So his view on Julia documentation lacks nuance. It is both good and bad depending on what you look at.
The post talks about the complexity if importing stuff with using and include. Yes, if you start from scratch it is more complex, but the benefit is that it scales better. I have helped compete beginners with Julia who had totally given up on Python due to the complexity of package management, modules and environments. Julia has a beautiful solution to this which is far easier to get right and manage.
A novice will find it easier to import packages they want to use with Julia compared to Python. But very often people evaluating this stuff are experienced Python developers and they don’t see the Python hassle easily. If you take somebody who is a beginner in both languages then experienced will be quite different.
The “multi paradigm” comment makes zero sense. Sure Julia is multi paradigm but it is far more streamlined than the common OOP-functional mess you see in other mainstream languages today such as Python , Java, C#, Swift.
In Julia it is all functions. You don’t distinguish between free functions and methods. For a beginner this is much easier to deal with.
The strengths of Matlab is that it's a domain-specific glue language with a domain-specific interactive environment. It's great if the benefits to you are worth the specificity and investment. Otherwise, something like Python might suit your needs better.
Either way, there's still often at least some native code you have to write and wrap. That's where a professional programmer might get involved. But probably more often than not, it's the engineers and scientists themselves.
Honestly, I don't know why Microsoft thought this was a good idea in the first place. Casual users don't know the difference between browsers and will just use the default anyways. But power users are going to use our preferred browser one way or the other. If it's difficult to set the default browser on Windows 11, then that's just one more reason we'll move to a better operating system.
That was a great article! Pipes can definitely be very powerful. I will say, though, that I often find myself reading pages of documentation in order to actually get anything with Unix and its many commands.
reply