#[1]Bartosz Milewski's Programming Cafe » Feed [2]Bartosz Milewski's
  Programming Cafe » Comments Feed [3]Bartosz Milewski's Programming Cafe
  » Math is your insurance policy Comments Feed [4]Fixed Points and
  Diagonal Arguments [5]alternate [6]alternate [7]Bartosz Milewski's
  Programming Cafe [8]WordPress.com

    * [9]Home
    * [10]About

[11]  Bartosz Milewski's Programming Cafe

  Category Theory, Haskell, Concurrency, C++

  February 24, 2020

Math is your insurance policy

  Posted by Bartosz Milewski under [12]Programming
  [13][3] Comments

  We live in interesting times. For instance, we are witnessing several
  extinction events all at once. One of them is the massive extinction of
  species. The other is the extinction of jobs. Both are caused by
  advances in technology. As programmers, we might consider ourselves
  immune to the latter–after all, somebody will have to program these
  self-driving trucks that eliminate the need for drivers, or the
  diagnostic tools that eliminate the need for doctors. Eventually,
  though, even programming jobs will be automated. I can imagine the last
  programmer putting finishing touches on the program that will make his
  or her job redundant.

  But before we get there, let’s consider which programming tasks are the
  first to go, and which have the biggest chance to persist for the
  longest time. Experience tells us that it’s the boring menial jobs that
  get automated first. So any time you get bored with your work, take
  note: you are probably doing something that a computer could do better.

  One such task is the implementation of user interfaces. All this code
  that’s behind various buttons, input fields, sliders, etc., is pretty
  much standard. Granted, you have to put a lot of effort to make the
  code portable to a myriad of platforms: various desktops, web browsers,
  phones, watches, fridges, etc. But that’s exactly the kind of expertise
  that is easily codified. If you find yourself doing copy and paste
  programming, watch out: your buddy computer can do it too. The work on
  generating UI has already started, see for instance, [14]pix2code.

  The design of user interfaces, as opposed to their implementation, will
  be more resistant to automation. Not only because it involves
  creativity, but also because it deals with human issues. Good design
  must serve the human in front of it. I’m not saying that modeling a
  human user is impossible, but it’s definitely harder. Of course, in
  many standard tasks, a drastically simplified human model will work
  just fine.

  So I’m sorry to say that, but those programmers who specialize in HTML
  and JavaScript will have to retrain themselves.

  The next job on the chopping block, in my opinion, is that of a human
  optimizer. In fact the only reason it hasn’t been eliminated yet is
  economical. It’s still cheaper to hire people to optimize code than it
  is to invest in the necessary infrastructure. You might think that
  programmers are expensive–the salaries of programmers are quite
  respectable in comparison to other industries. But if this were true, a
  lot more effort would go into improving programmers’ productivity, in
  particular in creating better tools. This is not happening. But as
  demand for software is growing, and the AI is getting cheaper, at some
  point the economic balance will change. It will be advantageous to use
  AI to optimize code.

  I’m sorry to say that, but C and C++ programmers will have to go. These
  are the languages whose only raison d’être is to squeeze maximum
  performance from hardware. We’ll probably always be interested in
  performance, but there are other ways of improving it. We are familiar
  with optimizing compilers that virtually eliminated the job of an
  assembly language programmer. They use optimizers that are based on
  algorithmic principles–that is methods which are understandable to
  humans. But there is a whole new generation of AI waiting in the
  aisles, which can be trained to optimize code written in higher level
  languages. Imagine a system, which would take this definition of
  quicksort written in Haskell:
qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
   where (lesser, greater) = partition (< p) xs

  and produce code that would run as fast as its hand-coded C
  counterpart. Even if you don’t know Haskell, I can explain this code to
  you in just a few sentences. The first line says that sorting an empty
  list produces an empty list. The second line defines the action of
  quicksort on a list that consists of a head p–that will be our
  pivot–and the tail xs. The result is the concatenation (the symbol ++)
  of three lists. The first one is the result of (recursively) sorting
  the list lesser, the second is the singleton list containing the pivot,
  and the third is the result of sorting the list greater. Finally, the
  pair of lists (lesser, greater) is produced by partitioning xs using
  the predicate (< p), which reads “less than p.” You can’t get any
  simpler than that.

  Of course the transformation required for optimizing this algorithm is
  highly nontrivial. Depending on the rest of the program, the AI might
  decide to change the representation of data from a list to a vector,
  replace copying by destructive swapping, put some effort in selecting a
  better pivot, use a different algorithm for sorting very short lists,
  and so on. This is what a human optimizer would do. But how much harder
  is this task than, say, playing a game of go against a grandmaster?

  I am immensely impressed with the progress companies like Google or IBM
  made in playing go, chess, and Jeopardy, but I keep asking myself, why
  don’t they invest all this effort in programming technology? I can’t
  help but see parallels with Ancient Greece. The Ancient Greeks made
  tremendous breakthroughs in philosophy and mathematics–just think about
  Plato, Socrates, Euclid, or Pythagoras–but they had no technology to
  speak of. Hero of Alexandria invented a steam engine, but it was never
  put to work. It was only used as a parlor trick. There are many
  explanations of this phenomenon, but one that strikes close to home is
  that the Greeks didn’t need technology because they had access to cheap
  labor through slavery. I’m not implying that programmers are treated
  like slaves–far from it–but they seem to be considered cheep labor. In
  fact it’s so cheap to produce software that most of it is given away
  for free, or for the price of users’ attention in ad-supported
  software. A lot of software is just bait that’s supposed to entice the
  user to buy something more valuable, like beer.

  It’s gradually becoming clear that programming jobs are diverging. This
  is not yet reflected in salaries, but as the job market matures, some
  programming jobs will be eliminated, others will increase in demand.
  The one area where humans are still indispensable is in specifying what
  has to be done. The AI will eventually be able to implement any
  reasonable program, as long as it gets a precise enough specification.
  So the programmers of the future will stop telling the computer how to
  perform a given task; rather they will specify what to do. In other
  words, declarative programming will overtake imperative programming.
  But I don’t think that explaining to the AI what it’s supposed to do
  will be easy. The AI will continue to be rather dumb, at least in the
  foreseeable future. It’s been noted that software that can beat the
  best go players in the world would be at a complete loss trying to
  prepare a dinner or clean the dishes. It’s able to play go because it’s
  reasonably easy to codify the task of playing go– the legal moves and
  the goal of the game. Humans are extremely bad at expressing their
  wishes, as illustrated by [15]the following story:

    A poor starving peasant couple are granted three wishes and the
    woman, just taking the first thing that comes to her mind, wishes
    for one sausage, which she receives immediately. Her husband,
    pointing out that she could have wished for immense wealth or food
    to last them a lifetime, becomes angry with her for making such a
    stupid wish and, not thinking, wishes the sausage were stuck on her
    nose. Sure enough, the sausage is stuck in the middle of her face,
    and then they have to use the third wish to make it go away, upon
    which it disappears completely.

  As long as the dumb AI is unable to guess our wishes, there will be a
  need to specify them using a precise language. We already have such
  language, it’s called math. The advantage of math is that it was
  invented for humans, not for machines. It solves the basic problem of
  formalizing our thought process, so it can be reliably transmitted and
  verified. The definition of quicksort in Haskell is very mathematical.
  It can be easily verified using induction, because it’s recursive, and
  it operates on a recursive data structure: a list. The first line of
  code establishes the base case: an empty list is trivially sorted. Then
  we perform the induction step. We assume that we know how to sort all
  proper sublists of our list. We create two such sublists by
  partitioning the tail around the pivot. We sort the sublists, and then
  construct the final sorted list by inserting the pivot between them. As
  mathematical proofs go, this one is not particularly hard. In fact, in
  a typical mathematical text, it would be considered so trivial as to be
  left as an exercise for the reader.

  Still, this kind of mathematical thinking seems to be alien to most
  people, including a lot of programmers. So why am I proposing it as the
  “programming language” of the future? Math is hard, but let’s consider
  the alternatives. Every programming language is a compromise between
  the human and the computer. There are languages that are “close to the
  metal,” like assembly or C, and there are languages that try to imitate
  natural language, like Cobol or SQL. But even in low level languages we
  try to use meaningful names for variables and functions in an attempt
  to make code more readable. In fact, there are programs that
  purposefully obfuscate source code by removing the formatting and
  replacing names with gibberish. The result is unreadable to most
  humans, but makes no difference to computers. Mathematical language
  doesn’t have to be machine readable. It’s a language that was created
  by the people, for the people. The reason why we find mathematical
  texts harder to read than, say, C++ code is because mathematicians work
  at a much higher abstraction level. If we tried to express the same
  ideas in C++, we would very quickly get completely lost.

  Let me give you a small example. In mathematics, a monad is defined as
  a monoid in the category of endofunctors. That’s a very succinct
  definition. In order to understand it, you have to internalize a whole
  tower of abstractions, one built on top of another. When we implement
  monads in Haskell, we don’t use that definition. We pick a particular
  very simple category and implement only one aspect of the definition
  (we don’t implement monadic laws). In C++, we don’t even do that. If
  there are any monads in C++, they are implemented ad hoc, and not as a
  general concept (an example is the future monad which, to this day, is
  incomplete).

  There is also some deeper math in the quicksort example. It’s a
  recursive function and recursion is related to algebras and fixed
  points. A more elaborate version of quicksort decomposes it into its
  more fundamental components. The recursion is captured in a combination
  of unfolding and folding that is called a hylomorphism. The unfolding
  is described by a coalgebra, while folding is driven by an algebra.
data TreeF a r = Leaf | Node a r r
 deriving Functor

split :: Ord a => Coalgebra (TreeF a) [a]
split [] = Leaf
split (a: as) = Node a l r
 where (l, r) = partition (< a) as

join :: Algebra (TreeF a) [a]
join Leaf = []
join (Node a l r) = l ++ [a] ++ r

qsort :: Ord a => [a] -> [a]
qsort = hylo join split

  You might think that this representation is an overkill. You may even
  use it in a conversation to impress your friends: “Quicksort is just a
  hylomorphism, what is the problem?” So how is it better than the
  original three-liner?
qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
   where (lesser, greater) = partition (< p) xs

  The main difference is that the flow of control in this new
  implementation is driven by a data structure generated by the functor
  TreeF. This functor describes a binary tree whose every node has a
  value of type a and two children. We use those children in the
  unfolding process to store lists of elements, lesser ones on the left,
  greater (or equal) on the right. Then, in the folding process, these
  children are replenished again–this time with sorted lists. This may
  seem like an insignificant change, but it uses a different processing
  ability of our brains. The recursive function tells us a linear,
  one-dimensional, story. It appeals to our story-telling ability. The
  functor-driven approach appeals to our visual cortex. There is an up
  and down, and left and right in the tree. Not only that, we can think
  of the algorithm in terms of movement, or animation. We are first
  “growing” the tree from the seed and then “traversing” it to gather the
  fruit from the branches. These are some powerful metaphors.

  If this kind of visualization works for us, it might as well work for
  the AI that will try to optimize our programs. It may also be able to
  access a knowledge base of similar algorithms based on recursion
  schemes and category theory.

  I’m often asked by programmers: How is learning category theory going
  to help me in my everyday programming? The implication being that it’s
  not worth learning math if it can’t be immediately applied to your
  current job. This makes sense if you are trying to locally optimize
  your life. You are close to the local minimum of your utility function
  and you want to get even closer to it. But the utility function is not
  constant–it evolves in time. Local minima disappear. Category theory is
  the insurance policy against the drying out of your current watering
  hole.

Share this:

    * [16]Reddit
    * [17]More
    *

    * [18]Twitter
    * [19]LinkedIn
    *
    * [20]Pocket
    * [21]Facebook
    *
    * [22]Email
    *

Like this:

  Like Loading...

Related


3 Responses to “Math is your insurance policy”

   1. [23]New top story on Hacker News: Math is your insurance policy –
      News about world Says:
      [24]February 24, 2020 at 10:53 am
      […] Math is your insurance policy 10 by ingve | 0 comments on
      Hacker News. […]
   2. [25]Math is your insurance policy – INDIA NEWS Says:
      [26]February 24, 2020 at 11:03 am
      […] Article URL:
      [27]https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-p
      olicy/ […]
   3. Henrik Giesel Says:
      [28]February 24, 2020 at 11:38 am
      Wonderfully eloquent. Another plus, that I finally have another
      reason to look at hylomorphisms again!

Leave a Reply [29]Cancel reply

  Enter your comment here...

  ____________________________________________________________
  ____________________________________________________________
  ____________________________________________________________
  ____________________________________________________________

  Fill in your details below or click an icon to log in:
    *
    *
    *
    *
    *

  [30]Gravatar
  Email (required) (Address never made public)
  ____________________
  Name (required)
  ____________________
  Website
  ____________________
  WordPress.com Logo

  You are commenting using your WordPress.com account. ( [31]Log Out /
  [32]Change )
  Google photo

  You are commenting using your Google account. ( [33]Log Out /
  [34]Change )
  Twitter picture

  You are commenting using your Twitter account. ( [35]Log Out /
  [36]Change )
  Facebook photo

  You are commenting using your Facebook account. ( [37]Log Out /
  [38]Change )
  [39]Cancel

  Connecting to %s

  [ ] Notify me of new comments via email.

  [ ] Notify me of new posts via email.

  Post Comment

  This site uses Akismet to reduce spam. [40]Learn how your comment data
  is processed.

Archived Entry

    * Post Date :
    * February 24, 2020 at 9:32 am
    * Category :
    * [41]Programming
    * Do More :
    * You can [42]leave a response, or [43]trackback from your own site.

  [44]Blog at WordPress.com.
  Send to Email Address ____________________ Your Name
  ____________________ Your Email Address ____________________
  _________________________
  loading Send Email [45]Cancel
  Post was not sent - check your email addresses!
  Email check failed, please try again
  Sorry, your blog cannot share posts by email.

  IFRAME: [46]likes-master

  %d bloggers like this:

References

  Visible links
  1. https://bartoszmilewski.com/feed/
  2. https://bartoszmilewski.com/comments/feed/
  3. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/feed/
  4. https://bartoszmilewski.com/2019/11/06/fixed-points-and-diagonal-arguments/
  5. https://public-api.wordpress.com/oembed/?format=json&url=https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/&for=wpcom-auto-discovery
  6. https://public-api.wordpress.com/oembed/?format=xml&url=https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/&for=wpcom-auto-discovery
  7. https://bartoszmilewski.com/osd.xml
  8. https://s1.wp.com/opensearch.xml
  9. https://bartoszmilewski.com/
 10. https://bartoszmilewski.com/about/
 11. https://bartoszmilewski.com/
 12. https://bartoszmilewski.com/category/programming/
 13. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comments
 14. https://arxiv.org/pdf/1705.07962.pdf
 15. https://en.wikipedia.org/wiki/Three_wishes_joke
 16. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/?share=reddit
 17. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/
 18. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/?share=twitter
 19. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/?share=linkedin
 20. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/?share=pocket
 21. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/?share=facebook
 22. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/?share=email
 23. https://newsblogie.wordpress.com/2020/02/24/new-top-story-on-hacker-news-math-is-your-insurance-policy/
 24. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-135912
 25. http://indianews.world/2020/02/25/math-is-your-insurance-policy/
 26. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-135914
 27. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/
 28. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-135920
 29. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#respond
 30. https://gravatar.com/site/signup/
 31. javascript:HighlanderComments.doExternalLogout( 'wordpress' );
 32. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/
 33. javascript:HighlanderComments.doExternalLogout( 'googleplus' );
 34. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/
 35. javascript:HighlanderComments.doExternalLogout( 'twitter' );
 36. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/
 37. javascript:HighlanderComments.doExternalLogout( 'facebook' );
 38. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/
 39. javascript:HighlanderComments.cancelExternalWindow();
 40. https://akismet.com/privacy/
 41. https://bartoszmilewski.com/category/programming/
 42. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#respond
 43. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/trackback/
 44. https://wordpress.com/?ref=footer_blog
 45. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#cancel
 46. https://widgets.wp.com/likes/master.html?ver=20190321#ver=20190321

  Hidden links:
 48. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-form-guest
 49. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-form-load-service:WordPress.com
 50. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-form-load-service:Twitter
 51. https://bartoszmilewski.com/2020/02/24/math-is-your-insurance-policy/#comment-form-load-service:Facebook