<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6918427997759942244</atom:id><lastBuildDate>Sun, 08 Mar 2026 08:24:14 +0000</lastBuildDate><category>Math</category><category>Software Engineering</category><category>Programming</category><category>Combinatorics</category><category>Software Development</category><category>Software Development Teams</category><category>Logic</category><category>Rant</category><category>Abstract Algebra</category><category>Computer Science</category><category>Graph Theory</category><category>Number Theory</category><category>Set Theory</category><category>Software Frameworks</category><category>Software Process</category><category>Group Theory</category><category>Linear Algebra</category><category>Linguistics</category><category>Naming</category><category>Probability Theory</category><category>Agile</category><category>Code Reuse</category><category>Education</category><category>Formal Language Theory</category><category>Information Entropy</category><category>Lattice Theory</category><category>Morphology</category><category>Order Theory</category><category>Scala</category><category>Software Complexity</category><category>Topology</category><category>API Design</category><category>Category Theory</category><category>Complex numbers</category><category>Design Patterns</category><category>Editing</category><category>Relational Algebra</category><category>Vector Space Model</category><category>Bayes</category><category>Big O</category><category>Clojure</category><category>Data Science</category><category>Domain Driven Design</category><category>Fibonacci</category><category>Fractal Geometry</category><category>Generic Programming</category><category>Java</category><category>Neuroscience</category><category>Pair Programming</category><category>Semantics</category><title>Elegant Coding</title><description></description><link>http://www.elegantcoding.com/</link><managingEditor>noreply@blogger.com (elegantcoding)</managingEditor><generator>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-6899682046135364041</guid><pubDate>Wed, 07 Mar 2018 17:19:00 +0000</pubDate><atom:updated>2021-02-06T18:13:36.226-05:00</atom:updated><title>Reimagining the Suburban Yard to Reverse Pollinator and Insect Decline</title><description>&lt;div&gt;&lt;h3&gt;A Possible Pollinator Solution and Other Things I Learned from My Nature Yard &lt;/h3&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkhNM00hYTWWyyhqHOhNWCU8BB7DNZ4hfRt5hEAhBvvf6sb7T5EXe1B9S-eE100MWv13QD9ap_bxij9eAZIcZgnCm29OXd2HssMPfEXTOxAvob4QSGyddVnR4uyBLtRLY5GIsOikf4-f5m/s1600/IMG_2336.banned.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkhNM00hYTWWyyhqHOhNWCU8BB7DNZ4hfRt5hEAhBvvf6sb7T5EXe1B9S-eE100MWv13QD9ap_bxij9eAZIcZgnCm29OXd2HssMPfEXTOxAvob4QSGyddVnR4uyBLtRLY5GIsOikf4-f5m/s400/IMG_2336.banned.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I wanted to share some things that I learned from growing native plants in my yard.  This will be about what I learned about nature and some discoveries about how we might rethink the idea of the suburban yard from an alternate land management perspective.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;My ideas and approach come from my childhood. I grew up in a bucolic setting in a heavily wooded area.  My mother’s side of my family is Pennsylvania Dutch and we carried on some of those traditions in collecting wild berries for jams and pies and growing our own food in gardens.  Another thing we would do was transplant plants from the woods to gardens, although I now realize this was probably not really a good thing to do.  I was different from other kids, more curious. I thought plants were beautiful and learned to identify them.  I still remember the thrill of finding large patches of native orchids.  I was a general science geek and over the years I got distracted by chemistry and eventually computers which lead to my career as a software developer. &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwLMCq8evMQTXaBkSVCCmOoWXfNa8vdPpySjwjs48qGjm4J1HYxToz0sZIZopKVxf07ywItb8Xz0Ddv6p228itsQB_XY4WCQQLeUs9ulu49gtNbbXtTrVM_GnAroQIy2zGeFLw2aCibuIM/s1600/2011-08-12_10.05.17_ant_rhino_IMG_2619.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwLMCq8evMQTXaBkSVCCmOoWXfNa8vdPpySjwjs48qGjm4J1HYxToz0sZIZopKVxf07ywItb8Xz0Ddv6p228itsQB_XY4WCQQLeUs9ulu49gtNbbXtTrVM_GnAroQIy2zGeFLw2aCibuIM/s400/2011-08-12_10.05.17_ant_rhino_IMG_2619.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; data-original-width=&quot;1600&quot; data-original-height=&quot;1200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Years ago I purchased my first and to date only home.   Initially I mowed my lawn and maintained it in the spirit of the American suburbs.  My love of native plants never really died out and became rekindled by the local flora.  Instead of transplanting plants I merely collected a few seeds here and there and started planting them in pots and the garden areas of my yard.  Over time I let them take over my whole yard and what I came to see was amazingly beautiful.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Please note that I took all the photographs in this post and with one exception, try to guess which one, they were all taken in my yard and thus they document the biodiversity that I created. You can click each photo to enlarge.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw7p9K3VVst-X54o3sMD8QRnjgCashafp3KNqWy_-aNnF8RFXMAodh-RWGTptKzEpZ0V8DdUDTxBOzPMaWbQRLOI2FX5GGNOyOoSAM2_LG06EXmrL7bB8YosA6byyFwjdAQOzdJXp5SRyQ/s1600/P6116586.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw7p9K3VVst-X54o3sMD8QRnjgCashafp3KNqWy_-aNnF8RFXMAodh-RWGTptKzEpZ0V8DdUDTxBOzPMaWbQRLOI2FX5GGNOyOoSAM2_LG06EXmrL7bB8YosA6byyFwjdAQOzdJXp5SRyQ/s400/P6116586.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;Aggressive Native Plants Will Own Your Yard&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;My yard became something of a Darwinian botanical Battle Royale.  As I planted various species of native plants and spread their seeds in my yard, I realized that given the soil and varying climatic aspects of the environment of my yard, some plants tended to be dominant.  Unfortunately some of the more interesting plants got outcompeted by the more robust plants.  These plants are perhaps less glamorous and while they are native plants and in some cases represent the natural cultural heritage of the region, Arlington County Virginia considers them weeds.  The upside is if you are lucky enough to live in a municipality that respects science, nature and its regional natural cultural heritage, you can with little watering and some periodic weed pulling of invasives create an environment where native species can dominate your property. &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEZ0MqkE_U-K9K-LW8eNmmmMtJjaw6hZqZC6hEHo8ABWWxZcTke0I8NrqQlmj-XH-TwE1wP-B43415_2aBZcLq03-OnVgFF9TJj6VkfVovjKhg5z7lgezVqsgWy2GsbV-QFSiGike4J0L5/s1600/image003.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEZ0MqkE_U-K9K-LW8eNmmmMtJjaw6hZqZC6hEHo8ABWWxZcTke0I8NrqQlmj-XH-TwE1wP-B43415_2aBZcLq03-OnVgFF9TJj6VkfVovjKhg5z7lgezVqsgWy2GsbV-QFSiGike4J0L5/s1600/image003.jpg&quot; data-original-width=&quot;623&quot; data-original-height=&quot;461&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;Bees Are Very Diverse&lt;/h2&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;If you follow the news you have no doubt heard about the plight of the bees, for brevity’s sake the beepocalypse.  What you may not realize is that the bees whose plight wins the attention of the media are an alien European species.  They are even trucked around like cattle to almond groves and other places and are made of use to pollinate the flowering plants that feed us, excluding the wind pollinated plants like wheat and oats.  In these stories we contemplate the Matrix like gruel that humanity will be subjected to when the pollinators die off and we only have the wind pollinated species for food. What they never tell you is that there are another set of bees constituting over a thousand species that might be able to step up and take on that role.  Maybe they could make the difference in pollination.  What would happen if we give them the habitat and opportunity to flourish?  Maybe we wouldn’t even need to create Black Mirror style robobees. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In my native plant yard I saw many species over the years and in the summer of 2016 it seemed that hundreds maybe thousands of bees visited my yard in a day.  At times it was like a small cloud of dozens of tiny bees floating above each of the plants in addition to all of the other bees.  That year in my yard the pollinator crisis seemed to be a myth as I saw the exact opposite of what I have read about.  Admittedly this is only one observation.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJCXGyiBUUjirhadR7eF9qd2wmThIZADRoEFFNGfdG0su8qw0Mgr_Uk9lp7W8LEb-S1PAi6VkooJP30QEpg5h2d-oWRaU5pM6sr37a95WYFi_O5yod2p-klC__Dfcs44_YYKEsn382ZLSr/s1600/Lep.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJCXGyiBUUjirhadR7eF9qd2wmThIZADRoEFFNGfdG0su8qw0Mgr_Uk9lp7W8LEb-S1PAi6VkooJP30QEpg5h2d-oWRaU5pM6sr37a95WYFi_O5yod2p-klC__Dfcs44_YYKEsn382ZLSr/s400/Lep.jpg&quot; width=&quot;400&quot; height=&quot;294&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Bees Are Not the Only Pollinators&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;While this statement might seem somewhat obvious as most people know that Butterflies (Lepidoptera) are also pollinators.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhruucRHtYQoI67WK1-ZgTGVKUW-Iy4zlY4aQQsTcwDHoFQu2MRcXtyIfQlZHPRt2R2B-TcdE3XoyEZvoKim-WB4LuWU3MUP2L0slbyfI8xwRSh29oL3xt4Pkds6C7-RHt-lAbROY55V8J/s1600/Hymenoptera.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhruucRHtYQoI67WK1-ZgTGVKUW-Iy4zlY4aQQsTcwDHoFQu2MRcXtyIfQlZHPRt2R2B-TcdE3XoyEZvoKim-WB4LuWU3MUP2L0slbyfI8xwRSh29oL3xt4Pkds6C7-RHt-lAbROY55V8J/s400/Hymenoptera.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;There are also other insects in the Hymenoptera family such as wasps and ants that also pollinate plants.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx7ghBUGmD_Rxlz7XRLqKAibR1HCgjuT42M8U0Cz_pcjsmt5t8trDcH9OfJFG_yeROw9TQdsXrWVgwZ2qX90yqwyTHUfN_M3s9_AQJCbJQrjzrn0LX2qR95p7RMIOgUuHZ7fzwus5VoRAS/s1600/Dip-pol.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx7ghBUGmD_Rxlz7XRLqKAibR1HCgjuT42M8U0Cz_pcjsmt5t8trDcH9OfJFG_yeROw9TQdsXrWVgwZ2qX90yqwyTHUfN_M3s9_AQJCbJQrjzrn0LX2qR95p7RMIOgUuHZ7fzwus5VoRAS/s400/Dip-pol.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Additionally some flies (Diptera) are pollinators as well.  In fact some plants like the Pawpaw tree, a tree known to my ancestors, with its fleshy colored flowers are dependent on carrion flies and beetle pollinators.  People will sometimes hang rotting meat and chicken bones on its branches to attract these pollinators.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgribnqIGMg-_0ePiV9ucBznoB9mwlKCO1QAzqKXo_SDeP4QLtkooQGh_HaLWQYqmAF1DxlDv1jAGXkE2iQCyFy0HS3Qvc5kOmWdT2I98TCE-_TK1jHo5fSaAHiAQf-7TbEhI9QnJf0ENqp/s1600/Hemiptera.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgribnqIGMg-_0ePiV9ucBznoB9mwlKCO1QAzqKXo_SDeP4QLtkooQGh_HaLWQYqmAF1DxlDv1jAGXkE2iQCyFy0HS3Qvc5kOmWdT2I98TCE-_TK1jHo5fSaAHiAQf-7TbEhI9QnJf0ENqp/s400/Hemiptera.jpg&quot; width=&quot;400&quot; height=&quot;297&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Many Things Are Pretending to Be What They Are Not&lt;/h2&gt;&lt;br /&gt;
&lt;h3&gt;Deception Might be a Preferred Approach in Nature&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;In nature insects use mimicry to try to deceive predators and prey.  Hemipterta often try to look like parts of a plant, such as thorns or look like insects that are infected with fuzzy white &lt;a href=&quot;https://www.wired.com/2015/05/these-waxy-protuberances-decorate-insects-butts/&quot;&gt;insecticidal fungus&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhccr1M9GaT9AozLaRwmSPGXk4m_9Cu9ZEmZz28_EjJ-xqMQtLa_OX259z6d5SaNYvj02KxHBYGz7leGS1SLFZQF4CBm_BszKw_am_6HVH4H4yn6Wa1wdCb-PYsq6ne0DaDmLSdmnwTDlKd/s1600/IMG_4757.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhccr1M9GaT9AozLaRwmSPGXk4m_9Cu9ZEmZz28_EjJ-xqMQtLa_OX259z6d5SaNYvj02KxHBYGz7leGS1SLFZQF4CBm_BszKw_am_6HVH4H4yn6Wa1wdCb-PYsq6ne0DaDmLSdmnwTDlKd/s400/IMG_4757.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Lepidoptera will have &lt;a href=&quot;https://en.wikipedia.org/wiki/Eyespot_(mimicry)&quot;&gt;eye patterns&lt;/a&gt; to dissuade predators from sneaking up on them.  One even mimics the Monarch Butterfly which is unpalatable due to absorbing milkweed toxins.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimFr5u9kpi2ZDf_lRHOJRS268LPJLRapGMfKr_8zxF4pZ2-J-_qy2GZUTHkyFuZEZxKcqkxgzKGVvV3CZRcMBhRvYbs2nxV_PlKUI42TxNTl-bgmo1owBKAk7TVibrGfu1liiKB4ZQqrM7/s1600/Diptera.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimFr5u9kpi2ZDf_lRHOJRS268LPJLRapGMfKr_8zxF4pZ2-J-_qy2GZUTHkyFuZEZxKcqkxgzKGVvV3CZRcMBhRvYbs2nxV_PlKUI42TxNTl-bgmo1owBKAk7TVibrGfu1liiKB4ZQqrM7/s400/Diptera.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Another potential human deception is to try to look like a badass.  In the insect world some of biggest badasses are wasps and bees of Hymenoptera who have stingers.  So if you want to look like a badass look like a wasp or a bee that can sting you even if you are a wimpy little fly.  The bottom left is a moth so even Lepidoptera gets in on this deception.  Nature is not without irony the Large headed fly (bottom right) actually lays its eggs in bumble bees and they gestate “alien style”, although apparently do not usually kill their hosts like the aliens.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4FsMGdcrZtEhhlDcolpquA-qnFWx5qztQdXbgx10EG2AnWhiUGtD8nacKSK1-nchd74hdG0cQMjcuaRTfTiVDnn5UKjDWDUB3PMPpXz9ozRbOjH8hgDyjEcEBOGpUMpTwq5sOaKG5wfDn/s1600/pred.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4FsMGdcrZtEhhlDcolpquA-qnFWx5qztQdXbgx10EG2AnWhiUGtD8nacKSK1-nchd74hdG0cQMjcuaRTfTiVDnn5UKjDWDUB3PMPpXz9ozRbOjH8hgDyjEcEBOGpUMpTwq5sOaKG5wfDn/s400/pred.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;You’ll Have Lots of Predators &lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;When you create a habitat that attracts a lot of insects it also attracts a lot insect predators.  Birds and spiders obviously fall into that category.  There are many insects that predate on other insects. Many larva including those of flower flies are predatory.  I suspect that yellow larva (bottom right) is waiting for an unsuspecting pollinator.   Top left an assassin bug feeds on a flower fly.  The two iridescent flies are &lt;a href=&quot;http://www.cirrusimage.com/flies_longlegged.htm&quot;&gt;long legged flies&lt;/a&gt;, predators who do elaborate mating dances on leaves throughout the day.   &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXIcr6N6OZC_ZVx-EFe7s74KGKXmgS1pjVewZjrwo2A0L9no5DlSmkLxdVa-eXbYFBUjlA4QFDrP6lhtU6WFKmVH_qTX2gF7QhrH3bhEfaKD55oVWdX1hL5xLSKVah81HebvahcRfxWTcH/s1600/sneaky.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXIcr6N6OZC_ZVx-EFe7s74KGKXmgS1pjVewZjrwo2A0L9no5DlSmkLxdVa-eXbYFBUjlA4QFDrP6lhtU6WFKmVH_qTX2gF7QhrH3bhEfaKD55oVWdX1hL5xLSKVah81HebvahcRfxWTcH/s400/sneaky.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Arachnids Are Sneaky and Exhibit Intelligence and Individualistic Social Behavior &lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Some spiders employ deceptive hunting techniques. As you can see above there are two crab spiders hiding and blending into the flowers.  I don’t know what the longer legged one in the two adjacent pictures is but it seems to be mimicking either a flower or a flower fly which I suspect was one of things it was trying to capture as there were lots of them around the Enchanters Nightshade plants it was hanging from. &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJvhY0by7qCWHO1R6oHkuBPppmRmihmxs3lX3lmmNBwvV3U0hWSzws5TM7brB5u4AhFh3ZAgf1eQWmNI0wI0oVtriKHXM6YuqovMqKUidTnlyPz069ZbA-IxqXOpgnI20NJUtjsOIc-fdR/s1600/Jumper-Mont.new.3.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJvhY0by7qCWHO1R6oHkuBPppmRmihmxs3lX3lmmNBwvV3U0hWSzws5TM7brB5u4AhFh3ZAgf1eQWmNI0wI0oVtriKHXM6YuqovMqKUidTnlyPz069ZbA-IxqXOpgnI20NJUtjsOIc-fdR/s400/Jumper-Mont.new.3.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; data-original-width=&quot;1600&quot; data-original-height=&quot;1200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Around the time I got my macro lens and started observing the jumping spiders in my yard, I came across an article about the surprising intelligence of the Portia jumping spider.  I have to admit they are fun to watch they move incredibly fast and their eye configuration is remarkable with two large eyes in the front and posterior eyes that potentially give them 360 degree vision, just try to imagine your brain processing that perspective.  They seem intelligent, it also seemed like they got used to being photographed and went from fleeing me to just ignoring me.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7KOXCh635iolFtYXTFcWx5V-bR1Mt3EPRwxTPzp_-U2tfapY-Uoqcv6GF6SJK5d_784tPqHBsmfSnzEXAEPrMslV3z9Gq41TF_EdwY_hzDSSbYV4TgbP0nN43-8jd_Dm1Fi82614BXe_g/s1600/Loose+Aggregation+-+o5.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7KOXCh635iolFtYXTFcWx5V-bR1Mt3EPRwxTPzp_-U2tfapY-Uoqcv6GF6SJK5d_784tPqHBsmfSnzEXAEPrMslV3z9Gq41TF_EdwY_hzDSSbYV4TgbP0nN43-8jd_Dm1Fi82614BXe_g/s400/Loose+Aggregation+-+o5.jpg&quot; width=&quot;400&quot; height=&quot;296&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Opiliones aka Daddy Long Legs aka Harvestmen exhibit individualistic social behavior.  The photo above shows what is reffered to as loose aggregation social behavior.  They would hang out with each other all day long sometimes in clusters of up to 20-30 individuals.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlM-OvGJUT7W_nxuaS1oeR8wGqEclaQE2Kn1Dcrkfj21-ipPVVnHHk6pBmu_cKNK4DBZH3hdmAoHFbAsFA5Ppg7fwvnK2YOEevIUn4YhNoBYEyRxVfWLUY75nPLaHook5lh8uMJJNw_SVE/s1600/octopus.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlM-OvGJUT7W_nxuaS1oeR8wGqEclaQE2Kn1Dcrkfj21-ipPVVnHHk6pBmu_cKNK4DBZH3hdmAoHFbAsFA5Ppg7fwvnK2YOEevIUn4YhNoBYEyRxVfWLUY75nPLaHook5lh8uMJJNw_SVE/s400/octopus.jpg&quot; width=&quot;400&quot; height=&quot;295&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;754&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I can’t help but to go on an astrobiological tangent here.  If you look at our deep ocean creatures you’ll often find cephalopods (octopuses, squids, etc.) and arthropods like crabs and lobsters which are related to our terrestrial arachnids, insects, among others.  A recent article talked about the possible ocean and life on &lt;a href=&quot;https://www.nasa.gov/feature/jpl/cassini-sees-heat-below-the-icy-surface-of-enceladus&quot;&gt;Saturn’s moon Enceladus&lt;/a&gt;.   I used to think it would be Jupiter’s moon Europa, but it might have issues of the water being under too high pressure.  If complex and even intelligent life were to evolve in these environments it could look similar to life in our oceans.   &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoEBjihXWY6cYgvVFgw3R1Pf-Wscc4C6R0hnN-OH9vu7tWlp9kBrkgqCUg2J_mobEBoierD3d28uB-GFaMeLwZq7rdolLHtbhEZynqCF0uQeFd_QBGcOokzXpXRz49vq4RMrxF_oNU9Ai1/s1600/J1_P6258165.1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoEBjihXWY6cYgvVFgw3R1Pf-Wscc4C6R0hnN-OH9vu7tWlp9kBrkgqCUg2J_mobEBoierD3d28uB-GFaMeLwZq7rdolLHtbhEZynqCF0uQeFd_QBGcOokzXpXRz49vq4RMrxF_oNU9Ai1/s400/J1_P6258165.1.jpg&quot; width=&quot;400&quot; height=&quot;291&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;744&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Cephalopods clearly display intelligence.  However, if one were to consider the jumping spider intelligence and individualistic opiliones social behavior this could point to the idea of intelligent social arthropods.  Could these species be a possible mirror to what intelligent life might look like deep in these ice moons oceans? &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOU8MVYRyRAp1pZpE-OnVyXUJ2EpZiDpUOwh2HSwcV0z6M1LO0dHCXuhSxtdI3H3oRgn1P5ajn3BrOGlkvn8pWG1mATmZ6lhYPWereeLH4Tw5oGVopXYuy1rmuKdfDtXPRLDIWArsKenpc/s1600/Spider.topology.2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOU8MVYRyRAp1pZpE-OnVyXUJ2EpZiDpUOwh2HSwcV0z6M1LO0dHCXuhSxtdI3H3oRgn1P5ajn3BrOGlkvn8pWG1mATmZ6lhYPWereeLH4Tw5oGVopXYuy1rmuKdfDtXPRLDIWArsKenpc/s400/Spider.topology.2.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; data-original-width=&quot;1600&quot; data-original-height=&quot;1200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Spiders Seem to Have a Better Understating of Topology than Humans&lt;/h2&gt;&lt;br /&gt;
Ok, I’m going to embellish these a bit.  In the top left you can see the conical shape created below the egg sac, probably a trap to funnel prey.  However, it’s very much a two manifold exhibiting a local maxima, most of the computer industry is trying to find these places with machine learning.   The bottom left shows the Cartesian-esque plane making it locally Euclidean and thus a 2 manifold yet again. The bottom right shows a typical spiders web, this, albeit a bit irregular, exhibits a polar coordinate representation of two dimensional plane, or perhaps a vector field on a two dimensional plane.  The spider on the top right sits atop an irregularly spaced two dimensional plane.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL3uw4JmapRxYgDOa1KAhRrZgJynwxIiI-NQhWwgtmdg1WeXe9ra5AA8lrsE40HxynoK7FdXx5F3xmwtBQA-E1ekywrOMkXEZPtsPQHJo54XLpdwlzpCiI3g-KjqmaCpIyuf9fctd6E2GR/s1600/P7261262.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL3uw4JmapRxYgDOa1KAhRrZgJynwxIiI-NQhWwgtmdg1WeXe9ra5AA8lrsE40HxynoK7FdXx5F3xmwtBQA-E1ekywrOMkXEZPtsPQHJo54XLpdwlzpCiI3g-KjqmaCpIyuf9fctd6E2GR/s400/P7261262.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;Indian Hemp Is an Amazing Plant&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;It is likely the local Necostins relied on Indian Hemp (Apocynum Cannabinum) for fibers for their bowstrings and maybe for other uses. You can lean more from the film &lt;a href=&quot;https://www.youtube.com/watch?v=8xgfQzpwnn0&quot;&gt;Soft as Silk - Strong as Steel: The living heritage of Apocynum Cannabinum&lt;/a&gt;. In fact I would make the case that this plant should be allowed to grow everywhere based on the fact that it is the natural cultural heritage of our region and I know it sounds cheesy but out of respect for those who came before us here on this land.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ok, Native American pretense and drama aside, there are some very practical reasons to grow Apocynum Cannabinum.  Last year it seemed to flower for about six weeks in late spring early summer, which means it supplied six weeks of flowers to support pollinators in that time period while not competing with the late summer plants it grew next to in my yard.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxKnPxGO5oNgWs2pzgbkHIBZm_u34WetHMja7kY9E1QXDMTJVe4lTfV1dZko86uyaKw5YF3Xle0SkclJBPVgBlpsplsZ6cFEoSYt4Z_ymznHjbpjrSEjXkRm5A7qF-Ua59Z7EXLr-xQEyo/s1600/P7291435.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxKnPxGO5oNgWs2pzgbkHIBZm_u34WetHMja7kY9E1QXDMTJVe4lTfV1dZko86uyaKw5YF3Xle0SkclJBPVgBlpsplsZ6cFEoSYt4Z_ymznHjbpjrSEjXkRm5A7qF-Ua59Z7EXLr-xQEyo/s400/P7291435.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Its strong structure that is comprised of those fibers seems to provide a physical support lattice that benefits other plants.  Indian Hemp Apocynum Cannabinum grows to a certain height.  Amongst it Jerusalem Artichokes, Wingstem, Hairy Leafcup, and Common Milkweed, grew taller and bloomed later.  When I was forced to cut down my yard, I manually removed all of the Indian Hemp first as I had intended to investigate how to extract fibers.  I noticed that the other plants seemed to have some physical dependence on the structural support it provided as they immediately fell over.  Now I know this is all anecdotal but it really did seem to make a difference.  Of course I had to cut down all of the other plants too so who knows how that might have played out.  Indian Hemp is related to milkweed, it has a milky sap and the leaves are hydrophobic as you can see in the photo above.  This creates significant plant mass that is pretty insect resistant. It’s also a very hardy species so it can probably survive a lot of hardship.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-TgiFj9gdsKL0FZMFAF1N28rUgI3iVgB2UDYCJXBVA0QkD-nKIZYi0RjjUyC3VIbUwnlbwa-x-jaUm11WndVylTcHccbKTEtObyDT6L-PHOdHl3OLCTbOSMkg7wQbZPRygTSHD6mHPc-/s1600/fly.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi-TgiFj9gdsKL0FZMFAF1N28rUgI3iVgB2UDYCJXBVA0QkD-nKIZYi0RjjUyC3VIbUwnlbwa-x-jaUm11WndVylTcHccbKTEtObyDT6L-PHOdHl3OLCTbOSMkg7wQbZPRygTSHD6mHPc-/s400/fly.jpg&quot; width=&quot;400&quot; height=&quot;295&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;754&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;If you look at many of my pictures of insects and spiders it plays the role of the stage for many of them.  In fact the jumping spiders seemed to use it as a way to move quickly in three dimensions and to catch ants on it.  While, the iridescent long legged flies performed their mating dances on its leaves.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBwB13q3Iuugxm_2YFXsUGS3cqCpWzpeJT30Ef5zYChhyphenhyphenPALFEWColEkovwBnWviVeDaw_zeONJZn1oeHq4VpM_tqsj7bLWBUMH-JnQIMNpoPoGCYhyphenhyphenmAkuU4CguctgUXMW6FCWqjpRK29/s1600/hawk.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBwB13q3Iuugxm_2YFXsUGS3cqCpWzpeJT30Ef5zYChhyphenhyphenPALFEWColEkovwBnWviVeDaw_zeONJZn1oeHq4VpM_tqsj7bLWBUMH-JnQIMNpoPoGCYhyphenhyphenmAkuU4CguctgUXMW6FCWqjpRK29/s400/hawk.jpg&quot; width=&quot;400&quot; height=&quot;309&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;790&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Every Year Brings Something New&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Every year in my yard I would see something I had not seen before and in many cases would not see again.  One year it was shiny metallic Dog Bane Beetles.  Another year it was lots of &lt;a href=&quot;http://www.elegantcoding.com/2016/05/my-ant-symbiosis-stories_31.html&quot;&gt;ants symbiotically tending to a brood of Rhino Thornbugs&lt;/a&gt; and aphids the next year.  Last year it was lots of jumping spiders, tiny bees, flower files, and lots of milkweed bugs mating.  The year before that it was an Opiliones explosion with hundreds of them.  I suspect things like predator prey cycles or other factors in climate and the plants and fungus each year affected what I saw.  Regardless, it is such a thrill to just experience what a nature yard will throw at you each year.  While this year brought me ground dwelling bees and hawks, sadly it also brings me much sorrow and stress.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP9GafhpSbsfrql0nlmcj0CI7MK2Z-O_58RUPA9EbQldB8pve9JQN0fQw97ozcKojtiHXgBevyypGKRHAmK09BpXVraQQ-42LZs2ern7xQVj75LRYr6zfd4KiG_JzFUFuEQhhVS3Gcc-Ei/s1600/P8082370.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP9GafhpSbsfrql0nlmcj0CI7MK2Z-O_58RUPA9EbQldB8pve9JQN0fQw97ozcKojtiHXgBevyypGKRHAmK09BpXVraQQ-42LZs2ern7xQVj75LRYr6zfd4KiG_JzFUFuEQhhVS3Gcc-Ei/s400/P8082370.JPG&quot; width=&quot;300&quot; height=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;You Can Create an Amazing Amount of Biodiversity in Even a Tiny Yard&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;My little yard, less than a quarter acre, supported around 20 species of native plants.  This is fairly diverse for such a small yard.  But the real diversity came in the form of the visitors especially the terrestrial arthropods, insects and arachnids but also many birds, chipmunks, and rabbits.  I am still astounded by what I saw when I would just look out the window or take a few steps out of my front door.  The photos here present it and there are many more species that I did not show.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG1gTKUIl6z_7qCf5w-60LLHtX0g-QZLC86ijwjrE_feMCH9tLoZtDMewuQ_tF1QAXkzbW0v_82nvfIWe6F0JM0y69ri1UFCKtXYgEawPco1w9W_Fkt47_lxCsuRh0Trbn1cqTRUtcdqnm/s1600/opiliones.night.crop.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG1gTKUIl6z_7qCf5w-60LLHtX0g-QZLC86ijwjrE_feMCH9tLoZtDMewuQ_tF1QAXkzbW0v_82nvfIWe6F0JM0y69ri1UFCKtXYgEawPco1w9W_Fkt47_lxCsuRh0Trbn1cqTRUtcdqnm/s400/opiliones.night.crop.JPG&quot; width=&quot;400&quot; height=&quot;288&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;738&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h2&gt;You Can Witness Mysteries of Nature That Even Scientists Don’t Really Understand&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Above I mentioned the Loose Aggregation Social behavior of Opiliones.  What’s really interesting and maybe a little sad is that scientists don’t really understand this behavior and there are way more questions than answers about the social structure and motivations of these creatures.  In a sense this is a true mystery of the universe and it happened one summer in my own back yard. Amazing!&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNVW_JniR9xiUtcZTDGf75WFFASTQUbwFlT1V2ueKYyFz9GmDzMCNswJPOhyphenhyphentsDA7m4bOZ-G5jKaHaY1DExbrAHq9fxgyLh5sowXQg3NkSrcnAU6Ef366LRPPizcfprj3R5QQ-Vd-oRgF/s1600/P7170246.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPNVW_JniR9xiUtcZTDGf75WFFASTQUbwFlT1V2ueKYyFz9GmDzMCNswJPOhyphenhyphentsDA7m4bOZ-G5jKaHaY1DExbrAHq9fxgyLh5sowXQg3NkSrcnAU6Ef366LRPPizcfprj3R5QQ-Vd-oRgF/s400/P7170246.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;You Can Be a God&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;I the movie Groundhog Day Bill Murray’s character Phil Connors declares himself a god, not the god, but a god.  This is due to the fact that he knows everything about the local environment and all events that he has not altered ahead of time.  When you plant a yard of native plants you create the natural environment in your yard. You create the opportunity for the most amazing things in nature to exist in your yard. You conjure these things into existence.  Ok, it’s an:  “if you build it they will come” scenario.   In a sense you become a god creating nature.  Admittedly a less dramatic perspective is you allow this to happen and the nature already existed.  But it’s a fun way to think of it and chances are all the drones living next you are creating the antithesis of this in their chemically treated monoculture yards.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh71UjLDMHnfFaMMXRR9a4EWNPDU4EpLqMb015vZIpDcRxfLmCImZLCuvjEQ9R0fm1JYrCfuH6Y92ajkHNQTlLn6MkLTNFB1TTzvdh7N7jqgLau5O4ixkfFgtKd1T4diz-ys2E3dQ49OEUe/s1600/IMG_4314.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh71UjLDMHnfFaMMXRR9a4EWNPDU4EpLqMb015vZIpDcRxfLmCImZLCuvjEQ9R0fm1JYrCfuH6Y92ajkHNQTlLn6MkLTNFB1TTzvdh7N7jqgLau5O4ixkfFgtKd1T4diz-ys2E3dQ49OEUe/s400/IMG_4314.JPG&quot; width=&quot;400&quot; height=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Your Local Municipality Is Most Likely the Enemy of the Environment&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;Unfortunately many municipalities, in spite of their pro-environmental rhetoric and propaganda, consider dense native plants in residential yards a nuisance.  In Arlington County the code enforcement officers refer to it as an “infestation”, which vaguely sounds like saying “witch”.  They also call it a public health and safety hazard for which I doubt they have any supporting evidence.  If you want to grow a native environment on your personal property, which should be your right, expect to be treated like a criminal and to be met with very parochial attitudes from very ignorant, very arrogant, and very officious local government employees whose salaries are paid for by your tax dollars.  Unfortunately, local ordinances effectively promote the use of toxic chemicals in suburban yards to maintain monoculture grass yards over native plants.  &lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhURX0hyphenhyphenl9qLdUrRQsZs7H0YpmJxAnuLTxZqSiA7CF8NI-NSQLxiG6Q2RjnV7yFn07Fe7Pr5FMwWo5XDeEcQj1uYq_bCa1-3hyphenhyphenmmexYV82tBpNGLHIc7x6CUmSKsT6M9FOD8zPu0icJ0so9/s1600/Ground+Bee.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhURX0hyphenhyphenl9qLdUrRQsZs7H0YpmJxAnuLTxZqSiA7CF8NI-NSQLxiG6Q2RjnV7yFn07Fe7Pr5FMwWo5XDeEcQj1uYq_bCa1-3hyphenhyphenmmexYV82tBpNGLHIc7x6CUmSKsT6M9FOD8zPu0icJ0so9/s400/Ground+Bee.JPG&quot; width=&quot;400&quot; height=&quot;314&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;805&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;The Solution to Our Pollinator Crisis Might Literally Be in Our Backyards&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;America really needs to rethink its obsession with the chemical treated manicured lawn.  Of course this is big business and I would not be surprised that if in aggregate, chemicals, services, equipment and other incidentals would number into the billions of dollars so there are obvious economic incentives to keep this going.  But are we really looking at the true costs here.  Local municipalities promote this through their ordinances and here in the Chesapeake estuary local citizens and service companies probably contribute tons of pesticide, herbicide and fertilizer run off that ends up in the Chesapeake.  My yard used none of these and replaced almost all of the grass with native plants.  In my back yard there was exposed dirt at the base of thick swaths of Virginia Knotweed, this is good habitat for native bees.  I would also leave tree branches to rot in my yard which also provided habitat for native bees, flies, arachnids, fungus and other things.  This also reduced the amount biomass that got fed into the county collection system which is funded at taxpayer expense.  It even felt like my air conditioner ran less with tall Jerusalem Artichokes, Hairy Leafcup and Indian Hemp in the front yard and as I mentioned it was amazingly beautiful.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9d0GvAp9Def-xnESC5nq6pUKDBoRBc8KNsN7ubmH5VoFtOCL04DA5lCrk_f3CJz90WPYgqitDDEEI3GRo5MIFPL81GX3gZAxvPhcHQ5vOUXSyWbstINw9LrcxJ7fV5Wirj1YreuGW35B/s1600/chipmunk.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu9d0GvAp9Def-xnESC5nq6pUKDBoRBc8KNsN7ubmH5VoFtOCL04DA5lCrk_f3CJz90WPYgqitDDEEI3GRo5MIFPL81GX3gZAxvPhcHQ5vOUXSyWbstINw9LrcxJ7fV5Wirj1YreuGW35B/s400/chipmunk.jpg&quot; width=&quot;400&quot; height=&quot;320&quot; data-original-width=&quot;1024&quot; data-original-height=&quot;818&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Now of course there are some potential pitfalls that need to be avoided and can be through the management of a nature yard.  Things like rat harboration would be a potential issue.  I did have a chipmunk burrow, not sure if that counts as a hazard.  Especially since chipmunks are super cute and the baby ones are even cuter.  Also I would destroy any colonies of wasps or yellow jackets as they are a danger to people unlike many of the native bees which are stingless. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;It seems to me if local municipalities would take an active role in encouraging native plant yards and were to create programs to help manage them and inspect them for potential hazards that many pollinators could be added to our local environments.  I don’t have any actual numbers so this is guestimate but it seemed like my tiny yard at its height was supporting hundreds maybe even over a thousand flower fly and native bee pollinators and I mean habitat for them to breed as well.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Arlington County and other municipalities could probably add hundreds of thousands if not millions of pollinators locally by allowing and incentivizing these types of yards, even at relatively low rates of adoption.  They would benefit the Chesapeake as well from reduced run off.  Think of the effect if this approach were to spread through the Mid-Atlantic megalopolis and the other &lt;a href=&quot;https://en.wikipedia.org/wiki/Megalopolis&quot;&gt;megalopolises&lt;/a&gt; in the United States.   &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Of course this is all conjecture on my part and I am a fan of science, I regret not applying a more scientific method to my yard, but it started as an innocent hobby.  This is an area that is under study at the National Arboretum &lt;a href=&quot;http://www.usna.usda.gov/Insect%20Pests%20in%20Urban%20Landscapes%20Experiment.pdf&quot;&gt;(pdf)&lt;/a&gt; and should probably be studied more in situ.   Of course how can you when it’s illegal in most municipalities in the U.S.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizVknoZ3KNaQ4C_okS07hJu7zs2GTYkHrP3XpW4F7kdIsfBXDB4kt3nfjJ5CyrbAnRLTZsnDSS-_iMxbm6NRFt9RmOhGpXRhCZ2p7Os7WrG0BpO7UEyc-z1XENSKI-jPkkZY2osktYxwVB/s1600/P7271319.1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizVknoZ3KNaQ4C_okS07hJu7zs2GTYkHrP3XpW4F7kdIsfBXDB4kt3nfjJ5CyrbAnRLTZsnDSS-_iMxbm6NRFt9RmOhGpXRhCZ2p7Os7WrG0BpO7UEyc-z1XENSKI-jPkkZY2osktYxwVB/s400/P7271319.1.jpg&quot; width=&quot;346&quot; height=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;&lt;br /&gt;
&lt;br /&gt;
All Things Come to an End&lt;/h2&gt;&lt;br /&gt;
&lt;p&gt;I have decided to sell and move out of Arlington. Arlington loves McMansions with monoculture lawns and that’s exactly what they will get:  one more.  I used to be somewhat proud to call myself an Arlingtonian, now I am just disgusted by Arlington County Government.  There are some other very annoying issues pertaining to the neighborhood that I live in that I tolerated due to my yard, they are now unbearable.  I will try to transplant some of the plants but many will not make it.  I will be sad to see the remains of what I built completely destroyed.  But in life sometimes you have to let go to move on.  I just hope what I did here will make some difference some day.&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2018/03/reimagining-suburban-yard-to-reverse.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkhNM00hYTWWyyhqHOhNWCU8BB7DNZ4hfRt5hEAhBvvf6sb7T5EXe1B9S-eE100MWv13QD9ap_bxij9eAZIcZgnCm29OXd2HssMPfEXTOxAvob4QSGyddVnR4uyBLtRLY5GIsOikf4-f5m/s72-c/IMG_2336.banned.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-1451016405469720491</guid><pubDate>Mon, 10 Apr 2017 13:13:00 +0000</pubDate><atom:updated>2017-04-10T09:58:11.833-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software Development</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><category domain="http://www.blogger.com/atom/ns#">Software Process</category><title>The Problem with Today’s Software Thought Leaders</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYBQP2K7sflWsyHN7ZSD__0IO2cIyA9ZZ1_KM0N55BEFQfv8HOy21hTJNizBbRBy5YxWmpD5zpaJympi3KZToSQFanyYbW_txn9k76_cSlsvLw330t7ofV_Z2I-9pBMCpvU9BIiRnS-sAz/s1600/thinker.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYBQP2K7sflWsyHN7ZSD__0IO2cIyA9ZZ1_KM0N55BEFQfv8HOy21hTJNizBbRBy5YxWmpD5zpaJympi3KZToSQFanyYbW_txn9k76_cSlsvLw330t7ofV_Z2I-9pBMCpvU9BIiRnS-sAz/s400/thinker.jpg&quot; width=&quot;400&quot; height=&quot;303&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

p.question {
    font-weight: bold;
    color: #94388e;
}

&lt;/style&gt;&lt;!-- The Problem with Today’s Software Thought Leaders --&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Albert Einstein once said:  &quot;What is right is not always popular and what is popular is not always right.&quot;   The current zeitgeist in software development has this exact same feel.  Our lives as software developers have been shaped by the ideas of many people.  Some of those ideas are right and some are popular.  In time the wrong ideas will fade and the right ideas will dominate.  The problem is: How do we make that determination in the present?  What are the good ideas and what are the bad ideas?  &lt;/p&gt;&lt;p&gt;As software developers our working days usually consist of two types of professional activities, one is obviously creating software (software development) or related technical tasks configuration management, troubleshooting, deployments, etc. and the other is being managed or other duties that relate to providing information (status) to managers (software development management).  The software industry is very young and constantly changing.  At any given moment there are dominant de facto standards that are followed for both software development and its management.  Although it varies across industry sectors, many development practices and tooling have become standards, things like &lt;a href=&quot;https://en.wikipedia.org/wiki/Integrated_development_environment&quot;&gt;IDE’s&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Continuous_integration&quot;&gt;continuous integration&lt;/a&gt;, the use of tests and testing frameworks, etc.  Some of these have been influenced by &lt;a href=&quot;https://en.wikipedia.org/wiki/Agile_software_development&quot;&gt;Agile&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Extreme_programming&quot;&gt;XP&lt;/a&gt;.   On the management side the standard seems to be largely dominated by Agile like &lt;a href=&quot;https://en.wikipedia.org/wiki/Scrum_(software_development)&quot;&gt;scrum&lt;/a&gt; and associated practices from XP. &lt;/p&gt;&lt;p&gt;The people who dominate our industry with their ideas could be described as our thought leaders.   Wikipedia has the following definition for &lt;a href=&quot;https://en.wikipedia.org/wiki/Thought_leader&quot;&gt;thought leader&lt;/a&gt;:  &lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;A thought leader can refer to an individual or firm that is recognized as an authority in a specialized field and whose expertise is sought and often rewarded.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;The creation of Agile was done in a ceremonious fashion, depicted in an odd ritualistic looking and now famous photograph, by signatories to a manifesto.   Let’s call these people the Agile Thought Leaders or just the Agilistas (since brevity is our thing).  The Agilistas have come to have their ideas dominate the industry and in many cases dictate how we now spend our days.  &lt;/p&gt;&lt;p&gt;It seems that Agile’s rise in popularity is directly proportional to my increasing skepticism about it.  I find myself internalizing that skepticism into frustration and even feelings of anger towards it and the Agilistas.  These feelings become exacerbated by the various incarnations of Agile created by legions of certified Agile consultants that roll into my life to tell me how to spend my days. &lt;/p&gt;&lt;p&gt;Now those feelings are not constructive and one really needs to step back and ask: Why is what I see in the industry wrong and how can I form and a constructive criticism of it?  &lt;/p&gt;&lt;p&gt;I was lucky to come across Greg Wilsons’s talk: &quot;&lt;a href=&quot;https://vimeo.com/9270320&quot;&gt;What We Actually Know About Software Development, and Why We Believe It&#39;s True&lt;/a&gt;&quot;.  This is a very enlightening talk which I highly recommend.  In it he looks objectively at how we have arrived where we are and how we can possibly better move forward.   I got the term Agilistas from his talk, although I don’t know if he coined it.&lt;/p&gt;&lt;p&gt;The talk touches on issues that I feel plague both my career and our industry. The problem manifests itself in how we make our decisions about what we do on projects both from the day to day and to the larger industry practices. Many of these decisions seem to be influenced all too often by people who claim some authority, sometimes it’s positional authority, sometimes it’s due to some form of gravitas and all too often right or wrong it boils down to someone’s opinion.  To better illustrate this about our thought leaders let&#39;s look at Greg Wilson’s critique of one of Martin Fowler’s publications about DSL’s (&lt;a href=&quot;https://en.wikipedia.org/wiki/Domain-specific_language&quot;&gt;Domain Specific Languages&lt;/a&gt;).  The relevant quotes with time stamps are as follows:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;11:26 [Martin Fowler] is a very deep and careful thinker about software and software design and last summer in IEEE Software he had an article on Domain Specific Languages, this notion that build a tiny language in which the solution to you original problem in easy to express. And in that he said using DSLs leads to improved programmer productivity and better communication with domain experts. &lt;/p&gt;&lt;p&gt;11:51 I want to show you what happened here. One of the smartest guys in our industry made two substantive claims of fact in an academic journal and there is not a single citation in the paper.  Not a single foot note or reference. There is no data to backup this claim. I am not saying that Martin is wrong in his claims. I am saying is what we have here is a Scottish verdict. Courts in Scotland are allowed to return one of three verdicts, guilty, innocent, or not proven.  Arguments in favor of DSLs, arguments in favor of functional programming languages making parallelism easier or Agile development leading to tenfold return on investment or whatever are unproven.  It doesn’t mean they are or wrong, it doesn’t mean they are right, it means that we don’t know and we should be humble enough to admit that. &lt;/p&gt;&lt;p&gt;12:38: Carrying on in that same article &quot;Debate still continues about how valuable DSLs are in practice. I believe that debate is hampered because not enough people know how to develop DSLs effectively.&quot;   Crap I think the debate is hampered by low standards of proof.&lt;/p&gt;&lt;p&gt;12:55:  Listening computer scientists argue, listening to software engineers in industry argue, it seems that the accepted standard of proof is I’ve two beers and there’s this anecdote about a tribe in new guinea from one of Scott Berkin’s books that seems to be vaguely applicable therefore I’m right.  Well no, sorry that’s not proof and you should have higher standards than that.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;I think these are excellent points. I disagree with Greg Wilson here and feel that Martin Fowler is not one of the smartest guys in our industry, although he maybe one of the most influential.  I also question whether he can be considered a careful thinker.  I think his approach like many of the other Agilistas is self serving and shows very little humility or willingness to be self critical. This is something that Bertrand Meyer commented on when reaching out to the Agilistas in conjunction with his book on &lt;u&gt;Agile! The Good, the Hype and the Ugly&lt;/u&gt; that almost all of  &lt;a href=&quot;https://youtu.be/ffkIQrq-m34?t=3429&quot;&gt;the Agilistas treated him with &quot;radio silence&quot; after receiving his draft&lt;/a&gt;.  The problem is that the Agile business is just too lucrative for consulting and on the speaking circuit.  A great example of this business model is &quot;Uncle Bob&quot; Martin’s infomercial-esque site promoting his wisdom for sale. I refuse to link to it, so google it, if you want to see that spectacle.  All of these guys make a lot of money selling Agile and if they started being critical of it that would be a risk to their revenue streams.  Also how many of these guys still do significant software development work?  Ironically I think Uncle Bob still codes, but I am talking about opening up an IDE or text editor after checking out a big code base from version control and fixing bugs or doing actual coding or refactoring.  Now maybe that’s not fair to ask that, or is it?  After all they are driving how we spend our days being managed on software projects.&lt;/p&gt;&lt;p&gt;Another point of contention I have can be found on Martin Fowlers website under the FAQ section:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p class=&quot;question&quot;&gt;Why is your job title &amp;quot;Chief Scientist&amp;quot;?&lt;/p&gt;&lt;p&gt;It&#39;s a common title in the software world, often given to someone who has a public facing technical role. I enjoy the irony of it - after all I&#39;m chief of nobody and &lt;b&gt;don&#39;t do any science&lt;/b&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;He openly admits he does no science (the black bolding is mine). Therein lays the problem with all of the Agilistas. There seems to be no scientific method involved in many if not all of their claims.  These claims as we have seen are sometimes made in &quot;academic&quot; journals without any citations. Of course I am skeptical about much that is written about software in journals published by ACM or IEEE and of the organizations themselves.  I think Greg Wilsons observation validates my skepticism and further draws attention to the lack of scientific method involved in software.  We need better science and people who are intellectually honest about the fact that they are just expressing unproven and in some cases unfounded opinions.&lt;/p&gt;&lt;p&gt;It seems to me a more conscientious approach would be for the Agilistas to promote and fund studies. Use the scientific method to back up their claims and help move the industry forward.  Whether they like it or not that is what will most likely eventually happen and they will either need to get on board or be left behind.&lt;/p&gt;&lt;p&gt;The irony here is that while we need more of a scientific method in defining software methodologies, much of our infrastructure comes from mathematics, another area that seems to be lacking with the Agilistas.  For example: Noam Chomsky’s formalization of grammars were adapted by Jim Backus and further refined algebraically by Donald Knuth to give us modern compiler theory and compilers.  There’s a long list of people who have laid down the mathematical foundations, people like Alan Turing, John Von Nueman, Alonzo Church, Stephen Cole Kleene, Haskell Curry and the list goes on.  Unfortunately I think too many people in our industry are ignorant of our field’s true mathematical underpinnings. I have also encountered a large degree of anti-intellectualism from programmers when it comes to applying modern math to programming.  Again I think this is an area where one should only ignore it at their own peril. &lt;/p&gt;&lt;p&gt;If you want to see the work that should and probably will drive our future I would recommend looking at what the researchers are doing, people like:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.cs.nott.ac.uk/~psarb2/&quot;&gt;Roland Backhouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.ox.ac.uk/people/publications/date/Richard.Bird.html&quot;&gt;Richard Bird&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html&quot;&gt;Jeremy Gibbons&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.ox.ac.uk/ralf.hinze/&quot;&gt;Ralf Hinze&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www-cs-faculty.stanford.edu/~uno/&quot;&gt;Donald E. Knuth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.kestrel.edu/home/people/meertens/&quot;&gt;Lambert Meertens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Erik_Meijer_(computer_scientist)&quot;&gt;Erik Meijer&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lampwww.epfl.ch/~odersky/&quot;&gt;Martin Odersky&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;These are just a few.  There are many people doing research that will eventually find its way into our industry.  It has been happening this way all along.  The problem with these people’s work is it requires real intellectual effort as opposed to the Agile approach which, while in some cases maybe common sense, all to often seems to come across as a bunch of platitudinous management speak. &lt;/p&gt;&lt;p&gt;I think we need to hold the Agilistas to higher standards of proof!&lt;/p&gt;&lt;p&gt;Disclaimer: I still code personal projects but have not been on a dev team doing real dev work in about 3-4 years after doing it for over 25 years.  Actually from what I have seen of Agile management techniques and war room/open office layouts, I am in no hurry to do any of that any time soon.&lt;/p&gt;&lt;br /&gt;
&lt;h1&gt;References and Further Reading&lt;/h1&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://blog.davidtate.org/2011/12/5-minute-book-review-facts-and-fallacies-of-software-engineering/&quot;&gt;5 minute book review: Facts and Fallacies of Software Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=5076452&amp;amp;filter%3DAND%28p_IS_Number%3A5076443%29&quot;&gt;A Pedagogical Framework for Domain-Specific Languages&lt;/a&gt;(paywalled, of course)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://brodzinski.com/2010/03/agile-leaders-knowledge.html&quot;&gt;Agile Bullshit: Agile Thought-Leaders Know It All&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://agilemanifesto.org/authors.html&quot;&gt;Agile Manifesto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ieeexplore.ieee.org/xpl/login.jsp?tp=&amp;amp;arnumber=1702600&amp;amp;url=http%3A%2F%2Fieeexplore.ieee.org%2Fxpls%2Fabs_all.jsp%3Farnumber%3D1702600&quot;&gt;&quot;An Experiment on Unit Increase in Problem Complexity&quot; Woodfield 1979&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.cranksoftware.com/burden-of-proof/&quot;&gt;Burden of Proof&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://skillsmatter.com/skillscasts/5192-eric-evans&quot;&gt;Challenging the fundamental assumptions of DDD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blogs.msdn.microsoft.com/cdndevs/2010/01/25/cusec-2010-keynote-greg-wilson-bits-of-evidence/&quot;&gt;CUSEC 2010 Keynote: Greg Wilson – &quot;Bits of Evidence&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://softwareflow.wordpress.com/2011/11/10/greg-wilsons-what-we-actually-know-about-software-development/&quot;&gt;Greg Wilson’s What We Actually Know About Software Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://leanpub.com/leprechauns/read#leanpub-auto-alternate-endings&quot;&gt;The Leprechauns of Software Engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/programming/comments/2luryq/the_leprechauns_of_software_engineering/&quot;&gt;The Leprechauns of Software Engineering (reddit)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mi.fu-berlin.de/w/Main/LutzPrechelt&quot;&gt;Lutz Prechelt&#39;s Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/programming/comments/3gmwob/no_silver_bullet_essence_and_accidents_of/&quot;&gt;No Silver Bullet — Essence and Accidents of Software Engineering (1986)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://www.elegantcoding.com/2017/04/the-problem-with-todays-software.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYBQP2K7sflWsyHN7ZSD__0IO2cIyA9ZZ1_KM0N55BEFQfv8HOy21hTJNizBbRBy5YxWmpD5zpaJympi3KZToSQFanyYbW_txn9k76_cSlsvLw330t7ofV_Z2I-9pBMCpvU9BIiRnS-sAz/s72-c/thinker.jpg" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-8897117000539314927</guid><pubDate>Wed, 08 Feb 2017 14:55:00 +0000</pubDate><atom:updated>2017-02-08T09:55:51.845-05:00</atom:updated><title>Data Science DC: Deep Learning Past, Present, and Near Future</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEielpyRTO7ummQotqJ_ItqKK3V2wJ22samlsZJIdZA43Ii8qjEaWTIGgE0-N-hsnM7hyzDzu1CgKT2GInPiJyu_cPONbOyDZB76YXcU5npMWSq0XCk5Om6_tyRO6bbs9ke8S5tW8NuZzkbY/s1600/MoMa_10.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEielpyRTO7ummQotqJ_ItqKK3V2wJ22samlsZJIdZA43Ii8qjEaWTIGgE0-N-hsnM7hyzDzu1CgKT2GInPiJyu_cPONbOyDZB76YXcU5npMWSq0XCk5Om6_tyRO6bbs9ke8S5tW8NuZzkbY/s400/MoMa_10.jpg&quot; width=&quot;400&quot; height=&quot;300&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}
&lt;/style&gt;&lt;!--Data Science DC: Deep Learning Past, Present, and Near Future--&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Here in Washington DC we are lucky to have a robust technical community and as a result we have many great technical meetups which include a number that fall under the local data science community.  I recently attended the Data Science DC (DSDC) talk &quot;&lt;a href=&quot;https://www.meetup.com/Data-Science-DC/events/236126882/&quot;&gt;Deep Learning Past, Present, and Near Future&lt;/a&gt;&quot; &lt;a href=&quot;https://www.facebook.com/startupcentralpage/videos/351441811907623/&quot;&gt;(video)&lt;/a&gt; &lt;a href=&quot;https://drive.google.com/open?id=0B6aNp0WRtKCvV3BaZmVPVzJ4Q1JPTFFuRTN6TEFoTnJraTlz&quot;&gt;(pdf slides)&lt;/a&gt; presented by  Dr. John Kaufhold who is a data scientist and managing partner of &lt;a href=&quot;http://www.deeplearninganalytics.com/&quot;&gt;Deep Learning Analytics&lt;/a&gt;.  This will be the second DSDC post I have written, the first is &lt;a href=&quot;http://www.elegantcoding.com/2012/12/data-science-dc-implicit-sentiment.html&quot;&gt;here&lt;/a&gt;. Parts of this post will be cross posted as a series on the DSDC blog (TBA), references to my previous blog posts either here or there will be to referring to my blog &lt;a href=&quot;http://elegantcoding.com&quot;&gt;elegantcoding.com&lt;/a&gt;.  My previous DSDC post was pretty much just play by play coverage of the talk.  I decided to take a slightly different approach.  My goal here is to present some of the ideas and source material in John&#39;s talk while adding and fleshing out some additional details.  This post should be viewed as &quot;augmentation&quot; as he talks about some things that I will not capture here. &lt;/p&gt;&lt;p&gt; I am guessing that some proportion of the audience that night is like me in that they feel the need to learn more about deep learning and machine learning in general.  This is a pressure that seems to be currently omnipresent in our industry. I know some people who are aggressively pursuing machine learning and math courses.  So I would like to add some additional resources vetted by John for people like myself who want to learn more about deep learning.&lt;/p&gt;&lt;p&gt;I decided to make this a single post in with parts. This will essentially parallel John&#39;s presentation, although I will change the order a bit.  The first part will summarize the past, present, and future of deep learning.  I will be doing some editorializing of my own on the AI future.  The second part will be an augmented list of resources including concepts, papers, and books in conjunction with what he provided for getting started and learning more in depth about deep learning. &lt;/p&gt;&lt;p&gt;I will give a brief history of deep learning based in part on John&#39;s slide, well actually &lt;a href=&quot;http://www.slideshare.net/LuMa921/deep-learning-the-past-present-and-future-of-artificial-intelligence&quot;&gt;Lukas Masuch&#39;s slide&lt;/a&gt;.  I am a fan of history, especially &lt;a href=&quot;https://en.wikipedia.org/wiki/James_Burke_(science_historian)&quot;&gt;James Burke&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Connections_(TV_series)&quot;&gt;Connections&lt;/a&gt; style history. It is hard for me to look at any current recent history without thinking of the greater historical context.  I have a broader &lt;a href=&quot;http://www.elegantcoding.com/2014/08/a-brief-and-incomplete-history-of.html&quot;&gt;computer history post&lt;/a&gt; that might be of interest to history of technology and history of science fans.  Three earlier relevant events might be the development of the &lt;a href=&quot;http://www.elegantcoding.com/2014/08/a-brief-and-incomplete-history-of.html#1805&quot;&gt;least squares method&lt;/a&gt; that lead to statistical regression, Thomas Bayes&#39;s &quot;&lt;a href=&quot;http://www.elegantcoding.com/2014/08/a-brief-and-incomplete-history-of.html#1906&quot;&gt;An Essay towards solving a Problem in the Doctrine of Chances&lt;/a&gt;&quot; and Andrey Markov&#39;s discovery of &lt;a href=&quot;http://www.elegantcoding.com/2014/08/a-brief-and-incomplete-history-of.html#1763&quot;&gt;Markov Chains&lt;/a&gt;.  I will leave those in the broader context and focus on the relative recent history of deep learning.&lt;/p&gt;&lt;h1&gt;An Incomplete History of Deep Learning&lt;/h1&gt;&lt;p&gt;&lt;a name=&quot;1951&quot;/&gt;1951:  Marvin Minsky and Dean Edmonds build SNARC (Stochastic Neural Analog Reinforcement Calculator) a neural net machine that is able to learn.  It is a randomly connected network of &lt;a href=&quot;https://en.wikipedia.org/wiki/Hebbian_theory&quot;&gt;Hebb synapses&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTvbQQ3Vhhb-XrxlTQ4p6x4tyhqxAViXFi2BvQOXair6y77lNDIDVeNXZIAiZmZ_V6RI0CJCaQWlqdzjWQFYMxPktUBbnRSEV_bx9g0bt74a4HvrRr9DTN6G8XeXIlHxCNIStIg_m1LUo/s1600/Mark_I_perceptron.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBTvbQQ3Vhhb-XrxlTQ4p6x4tyhqxAViXFi2BvQOXair6y77lNDIDVeNXZIAiZmZ_V6RI0CJCaQWlqdzjWQFYMxPktUBbnRSEV_bx9g0bt74a4HvrRr9DTN6G8XeXIlHxCNIStIg_m1LUo/s200/Mark_I_perceptron.jpg&quot; width=&quot;163&quot; height=&quot;200&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1957&quot;/&gt;1957:  Frank Rosenblatt invents the &lt;a href=&quot;https://en.wikipedia.org/wiki/Perceptron&quot;&gt;Perceptron&lt;/a&gt; at the Cornell Aeronautical Laboratory with naval research funding.  He publishes &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.588.3775&quot;&gt;The Perceptron: A Probabilistic Model for Information Storage and Organization in The Brain&lt;/a&gt;&quot; in  1958 .  It is initially implemented in software for the &lt;a href=&quot;https://en.wikipedia.org/wiki/IBM_704&quot;&gt;IBM 704&lt;/a&gt; and subsequently implemented in custom-built hardware as the &quot;Mark 1 Perceptron&quot;. &lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1969&quot;/&gt;1969: &lt;a href=&quot;https://en.wikipedia.org/wiki/Marvin_Minsky&quot; title=&quot;Marvin Minsky&quot;&gt;Marvin Minsky&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Seymour_Papert&quot; title=&quot;Seymour Papert&quot;&gt;Seymour Papert&lt;/a&gt;  publish &lt;u&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Perceptrons_(book)&quot; title=&quot;Perceptrons (book)&quot;&gt;Perceptrons&lt;/a&gt;&lt;/u&gt; which showed that it was impossible for these classes of networks to learn an &lt;a href=&quot;https://en.wikipedia.org/wiki/XOR&quot; title=&quot;XOR&quot;&gt;XOR&lt;/a&gt; function.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1970&quot;/&gt;1970:  &lt;a href=&quot;https://en.wikipedia.org/wiki/Seppo_Linnainmaa&quot;&gt;Seppo Linnainmaa&lt;/a&gt; publishes the general method for automatic differentiation of discrete connected networks of nested differentiable functions. This corresponds to the modern version of back propagation which is efficient even when the networks are sparse.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1973&quot;/&gt;1973:  &lt;a href=&quot;https://en.wikipedia.org/wiki/Stuart_Dreyfus&quot;&gt;Stuart Dreyfus&lt;/a&gt; uses &lt;a href=&quot;https://en.wikipedia.org/wiki/Backpropagation&quot;&gt;backpropagation&lt;/a&gt; to adapt parameters of controllers in proportion to error gradients.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1972&quot;/&gt;1972:  Stephen Grossberg published the first of a series of papers introducing networks capable of modeling differential, contrast-enhancing and &lt;a href=&quot;https://en.wikipedia.org/wiki/Exclusive_or&quot;&gt;XOR&lt;/a&gt; functions. &quot;&lt;a href=&quot;http://cns.bu.edu/Profiles/Grossberg/Gro1973StudiesAppliedMath.pdf&quot;&gt;Contour enhancement, short-term memory, and constancies in reverberating neural networks (pdf)&lt;/a&gt;&quot;. &lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1974&quot;/&gt;1974:  Paul Werbos mentions the possibility of applying back propagation to artificial neural networks.  Back propagation had been initially context of control theory by Henry J. Kelley and Arthur E. Bryson in the early 1960s.  Around the same time Stuart Dreyfus published a simpler derivation based only on the chain rule. &lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1974–80&quot;/&gt;1974–80:  First &lt;a href=&quot;https://en.wikipedia.org/wiki/AI_winter&quot;&gt;AI winter&lt;/a&gt; which may have been in part caused by the often mis-cited 1969 &lt;a href=&quot;https://en.wikipedia.org/wiki/Perceptrons_(book)&quot; title=&quot;Perceptrons (book)&quot;&gt;Perceptrons&lt;/a&gt; by Minsky and Papert. &lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkqRxwjMlBvCuw7NLANWWMRUwcd3ltY-9P6RYJ_owDPKIGUQ1gpRNaW2kPI3s1HKw8hunG9u09bBAOZY8mCjAXdSE2U3g41rQKxoy17YRexbWqyIE7zU_mAnkfy2WqA-VilmmBj9xrv9Oe/s1600/Colored_neural_network_svg.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkqRxwjMlBvCuw7NLANWWMRUwcd3ltY-9P6RYJ_owDPKIGUQ1gpRNaW2kPI3s1HKw8hunG9u09bBAOZY8mCjAXdSE2U3g41rQKxoy17YRexbWqyIE7zU_mAnkfy2WqA-VilmmBj9xrv9Oe/s200/Colored_neural_network_svg.png&quot; width=&quot;166&quot; height=&quot;200&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1980&quot;/&gt;1980:  &lt;a href=&quot;https://en.wikipedia.org/wiki/Neocognitron&quot;&gt;Neoconitron&lt;/a&gt;, a hierarchical, multilayered artificial neural network, is proposed by Kunihiko Fukushima.  It has been used for handwritten character recognition and other pattern recognition tasks and served as the inspiration for &lt;a href=&quot;https://en.wikipedia.org/wiki/Convolutional_neural_network&quot;&gt;convolutional neural networks&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_yWt8adaHoOe-aLF1uvXEEt9Gd2D2ajZLUBHNCyBPW6olGeqa7A6XQJSC6yAAjg59QsZPULP9McANRPgQyOomireSDsqBW3c4b9D5vcIUSMPUHPYv9iaexiyeA3cGWErjLwDBuuC3Mfc7/s1600/Hopfield-net.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_yWt8adaHoOe-aLF1uvXEEt9Gd2D2ajZLUBHNCyBPW6olGeqa7A6XQJSC6yAAjg59QsZPULP9McANRPgQyOomireSDsqBW3c4b9D5vcIUSMPUHPYv9iaexiyeA3cGWErjLwDBuuC3Mfc7/s200/Hopfield-net.png&quot; width=&quot;192&quot; height=&quot;200&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1982&quot;/&gt;1982: &lt;a href=&quot;https://en.wikipedia.org/wiki/John_Hopfield&quot;&gt;John Hopfield&lt;/a&gt; popularizes &lt;a href=&quot;https://en.wikipedia.org/wiki/Hopfield_net&quot;&gt;Hopfield networks&lt;/a&gt;, a type of recurrent neural network that can serve as &lt;a href=&quot;https://en.wikipedia.org/wiki/Content-addressable_memory&quot;&gt;content-addressable memory&lt;/a&gt; systems.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1982.1&quot;/&gt;1982: Stuart Dreyfus applies Linnainmaa&#39;s automatic differentiation method to neural networks in the way that is widely used today.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1986&quot;/&gt;1986: David E. Rumelhart, Geoffrey E. Hinton and Ronald J. Williams publish &quot;&lt;a href=&quot;http://www.cs.toronto.edu/~hinton/absps/naturebp.pdf&quot;&gt;Learning representations by back-propagating errors (pdf)&lt;/a&gt;&quot;.  This shows through computer experiments that this method can generate useful internal representations of incoming data in hidden layers of neural networks&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1987&quot;/&gt;1987: Minsky and Papert publish &quot;Perceptrons - Expanded Edition&quot; where some errors in the original text are shown and corrected.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1987–93&quot;/&gt;1987–93: Second &lt;a href=&quot;https://en.wikipedia.org/wiki/AI_winter&quot;&gt;AI winter&lt;/a&gt; occurs. Caused in part by the collapse of the Lisp machine market and the fall of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Expert_system&quot;&gt;expert system&lt;/a&gt;. Additionally training times for deep neural networks are too long making them impractical for real world applications. &lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1993&quot;/&gt;1993:  Eric A. Wan wins the an international pattern recognition contest. This is the first time backpropagation is used to win this contest.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1995&quot;/&gt;1995: Corinna Cortes and Vapnik publish current standard incarnation (soft margin) in &quot;&lt;a href=&quot;http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.15.9362&quot;&gt;Support-Vector Networks&lt;/a&gt;&quot;.  The original &lt;a href=&quot;https://en.wikipedia.org/wiki/Support_vector_machine&quot;&gt;SVM&lt;/a&gt; algorithm was invented by Vladimir N. Vapnik and Alexey Ya. Chervonenkis in 1963. SVMs now take a dominant role in AI.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1997&quot;/&gt;1997: &lt;a href=&quot;https://en.wikipedia.org/wiki/Sepp_Hochreiter&quot;&gt;Sepp Hochreiter&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/J%C3%BCrgen_Schmidhuber&quot;&gt;Jürgen Schmidhuber&lt;/a&gt; invent Long-short term memory (&lt;a href=&quot;https://en.wikipedia.org/wiki/Long_short-term_memory&quot;&gt;LSTM&lt;/a&gt;) recurrent neural networks greatly improving the efficiency and practicality of recurrent neural networks.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;1998&quot;/&gt;1998: A team led by &lt;a href=&quot;https://en.wikipedia.org/wiki/Yann_LeCun&quot; title=&quot;Yann LeCun&quot;&gt;Yann LeCun&lt;/a&gt; releases the &lt;a href=&quot;https://en.wikipedia.org/wiki/MNIST_database&quot; title=&quot;MNIST database&quot;&gt;MNIST database&lt;/a&gt;, a dataset comprising a mix of handwritten digits from &lt;a href=&quot;https://en.wikipedia.org/wiki/American_Census_Bureau&quot; title=&quot;American Census Bureau&quot;&gt;American Census Bureau&lt;/a&gt; employees and American high school students. The MNIST database has since become a benchmark for evaluating handwriting recognition.  Lecun, Bottou, Bengio, Haffner publish &quot;&lt;a href=&quot;http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf&quot;&gt;Gradient-Based Learning Applied to Document Recognition (pdf)&lt;/a&gt;&quot;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLtN64elLpD3yfOfOPkCwP5EAI4vlkqB8WelqcT3Wy5wg11zt6E1u6B7Xezdu-abAjGbQlOIYdNUkjETwnpQo1c7k0IqP-jsxPx65Mfkzz5yNCq_Z8y__ca-oBBZDhs-u1Xh9IiRPmq7x/s1600/image004.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihLtN64elLpD3yfOfOPkCwP5EAI4vlkqB8WelqcT3Wy5wg11zt6E1u6B7Xezdu-abAjGbQlOIYdNUkjETwnpQo1c7k0IqP-jsxPx65Mfkzz5yNCq_Z8y__ca-oBBZDhs-u1Xh9IiRPmq7x/s200/image004.png&quot; width=&quot;200&quot; height=&quot;157&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1999&quot;/&gt;1999: NVIDIA Invents the &lt;a href=&quot;https://en.wikipedia.org/wiki/Graphics_processing_unit&quot;&gt;GPU&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;2006&quot;/&gt;2006: Geoffrey Hinton and Ruslan Salakhutdinov publish &quot;&lt;a href=&quot;http://www.cs.toronto.edu/~hinton/science.pdf&quot;&gt;Reducing the Dimensionality of Data with Neural Networks (pdf)&lt;/a&gt;&quot;  This is an unsupervised learning breakthrough that now allows for the training of deeper networks.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;2007&quot;/&gt;2007: NVIDIA launches the &lt;a href=&quot;https://en.wikipedia.org/wiki/CUDA&quot;&gt;CUDA&lt;/a&gt; programming platform. This opens up the general purpose parallel processing capabilities of the GPU.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;2009&quot;/&gt;2009: NIPS Workshop on Deep Learning for Speech Recognition discovers that with a large enough data set, the neural networks don&#39;t need pre-training, and the error rates drop significantly.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;2012&quot;/&gt;2012: Artificial pattern-recognition algorithms achieve human-level performance on certain tasks.  This is demonstrated by Alex Krizhevsky, Ilya Sutskever, Geoffrey E. Hinton using the &lt;a href=&quot;http://www.image-net.org/&quot;&gt;ImageNet&lt;/a&gt; dataset and published as &quot;&lt;a href=&quot;http://www.cs.toronto.edu/~hinton/absps/imagenet.pdf&quot;&gt;ImageNet Classification with Deep Convolutional Neural Networks (pdf)&lt;/a&gt;&quot;.  &lt;/p&gt;&lt;p&gt;&lt;a name=&quot;2012.1&quot;/&gt;2012: &lt;a href=&quot;https://googleblog.blogspot.ca/2012/06/using-large-scale-brain-simulations-for.html&quot;&gt;Google&#39;s deep learning algorithm discovers cats&lt;/a&gt;.  AI now threatens the cat cabal control of the internet.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;2015&quot;/&gt;2015: Facebook puts deep learning technology - called DeepFace - into operation to automatically tag and identify Facebook users in photographs. Algorithms perform superior face recognition tasks using deep networks that take into account 120 million parameters.&lt;/p&gt;&lt;h1&gt;A Brief and Incomplete History of Game Playing Programs and AIs&lt;/h1&gt;&lt;p&gt;&lt;a name=&quot;games1951&quot;/&gt;1951: Alan Turing is first to publish a program, capable of playing a full game of chess, developed on paper during a whiteboard coding interview.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games1952&quot;/&gt;1952: Arthur Samuel joins IBM&#39;s Poughkeepsie Laboratory and begins working on some of the very first machine learning programs, first creating programs that play checkers.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games1992&quot;/&gt;1992: Gerald Tesauro at IBM&#39;s Thomas J. Watson Research Center develops &lt;a href=&quot;https://en.wikipedia.org/wiki/TD-Gammon&quot;&gt;TD-Gammon&lt;/a&gt; a computer backgammon program. Its name comes from the fact that it is an artificial neural net trained by a form of &lt;a href=&quot;https://en.wikipedia.org/wiki/Temporal_difference_learning&quot;&gt;temporal-difference learning&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games1997&quot;/&gt;1997: IBM &lt;a href=&quot;https://en.wikipedia.org/wiki/Deep_Blue_(chess_computer)&quot;&gt;Deep Blue&lt;/a&gt; Beats &lt;a href=&quot;https://en.wikipedia.org/wiki/Garry_Kasparov&quot;&gt;Kasparov&lt;/a&gt;, the world champion at chess.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games2011&quot;/&gt;2011: IBM&#39;s &lt;a href=&quot;https://en.wikipedia.org/wiki/Watson_(computer)&quot;&gt;Watson&lt;/a&gt; using a combination of machine learning, natural language processing and information retrieval techniques beats two human champions on the TV game show Jeopardy! Later versions of Watson successfully banter with Alex thus further surpassing human capabilities.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games2013&quot;/&gt;2013: DeepMind learns to play 7 Atari games, surpassing humans on three of them, using &lt;a href=&quot;https://deepmind.com/research/publications/playing-atari-deep-reinforcement-learning/&quot;&gt;Deep Reinforcement Learning&lt;/a&gt; and no adjustments to the architecture or algorithm.  It eventually learns additional games taking the number to 46.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games2016&quot;/&gt;2016: &lt;a href=&quot;https://en.wikipedia.org/wiki/AlphaGo&quot;&gt;AlphaGo&lt;/a&gt;, Google DeepMind&#39;s algorithm, defeats the professional Go player Lee Sedol.&lt;/p&gt;&lt;p&gt;&lt;a name=&quot;games2017&quot;/&gt;2017: &lt;a href=&quot;https://arxiv.org/abs/1701.01724&quot;&gt;DeepStack&lt;/a&gt; becomes the first computer program to beat professional poker players in heads-up no-limit Texas hold&#39;em.&lt;/p&gt;&lt;h1&gt;The Present and Future&lt;/h1&gt;&lt;p&gt;John also included the idea of Geoffrey Hinton, Yann LeCun, and Yoshua Bengio being the triumvirate that weathered the AI winter, a theme that he used in his first &lt;a href=&quot;https://www.youtube.com/watch?v=T0FEZYZqqV8&quot;&gt;DSDC talk&lt;/a&gt; as well.  Since it was one of Homer&#39;s vocabulary words, I couldn&#39;t resist creating my own graphic for it:&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoVi8Oc6-0ZXO-jKOkEXqhQRI9DTZKaTStK-1pvLJbk_wzrVAi_RDkUB-JYjogvOkt9eDEQEGCmwxTrOr6abicpqIJ-nc_18xRJS7LU4_SNXass8-uZ0-kjB7EcKPGRoCB82XWhP16wzYA/s1600/Homer.1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoVi8Oc6-0ZXO-jKOkEXqhQRI9DTZKaTStK-1pvLJbk_wzrVAi_RDkUB-JYjogvOkt9eDEQEGCmwxTrOr6abicpqIJ-nc_18xRJS7LU4_SNXass8-uZ0-kjB7EcKPGRoCB82XWhP16wzYA/s320/Homer.1.png&quot; width=&quot;320&quot; height=&quot;240&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;While the triumvirate researchers are definitely major players in the field, there are many others. There seems to be some drama about giving credit where credit is due. John goes into some of the drama surrounding this.  Unfortunately it seems to human nature sometimes we have drama surrounding scientific discoveries and this is no exception in the Deep Learning community today. Geoffrey Hinton also catches some flak on &lt;a href=&quot;https://www.reddit.com/r/MachineLearning/comments/48vk66/geoffrey_hinton_the_code_that_runs_our_lives/&quot;&gt;reddit&lt;/a&gt; (ok, no surprise there) for not properly crediting Seppo Linnainmaa for backpropagation.  It is natural to want credit for one&#39;s ideas, however, these ideas are never conceived of in a vacuum and sometimes they are discovered independently, Calculus springs to mind.  As they say history is written by the winners.  John made a remark about &lt;a href=&quot;https://en.wikipedia.org/wiki/Rosalind_Franklin&quot;&gt;Rosalind Franklin&#39;s&lt;/a&gt; Nobel Prize for the double helix. I asked him how many people in the audience he thought got that remark and he replied: &quot;One, apparently :) I&#39;ll take it!&quot; &lt;a href=&quot;https://en.wikipedia.org/wiki/Lise_Meitner&quot;&gt;Lise Meitner&lt;/a&gt; is another interesting example of someone who failed to be recognized by the Nobel committee for her work in nuclear fission. &lt;/p&gt;&lt;p&gt;A major name in the field is Jeff Dean.  John mentioned &lt;a href=&quot;https://www.quora.com/What-are-all-the-Jeff-Dean-facts&quot;&gt;Jeff Dean facts&lt;/a&gt;.  This is apparently based on the Chuck Norris facts.  Jeff Dean somewhat of a legend and it is hard to tell what is real and what is made up about him. Do compilers really apologize to him?  We may never know. As I understand it he was one of the crucial early engineers to have helped create the success of Google. He was instrumental in the conception and development of both &lt;a href=&quot;https://research.google.com/archive/mapreduce.html&quot;&gt;Map Reduce&lt;/a&gt; and &lt;a href=&quot;https://research.google.com/archive/bigtable.html&quot;&gt;Big table&lt;/a&gt; not only solidifying Google&#39;s successful infrastructure but also laying down much of the foundation of major big data tools like Hadoop and Cassandra.  There is some serendipitous timing here in that Jeff Dean published &quot;&lt;a href=&quot;https://research.googleblog.com/2017/01/the-google-brain-team-looking-back-on.html&quot;&gt;The Google Brain team - Looking Back on 2016&lt;/a&gt;&quot; on the Google Research Blog a few days after John&#39;s talk.  His post lays out a number of areas where deep learning has made significant contributions as well other updates from their team.  &lt;/p&gt;&lt;p&gt;The present and near future for Deep Learning is very bright.  There are many deep learning companies that have been acquired and many of these are small averaging about 7 people.  John describes this as a startup stampede. Most likely a lot of these are acqui-hires since the labor pool for deep learning is very small.  Apparently the top talent is receiving NFL equivalent compensation.  &lt;/p&gt;&lt;p&gt;It&#39;s fairly obvious that deep learning and machine learning are the current hotness in our industry. One metric might be, given any random moment, go on hacker news and you will most likely see a deep learning article if not a machine learning article on the front page.  As if this is not enough, now Kristen Stewart famous for the Twilight movies, has coauthored an AI paper: &quot;&lt;a href=&quot;https://arxiv.org/abs/1701.04928&quot;&gt;Bringing Impressionism to Life with Neural Style Transfer in Come Swim&lt;/a&gt;&quot;. I am now waiting for an AI paper from Jesse Eisenberg. &lt;/p&gt;&lt;p&gt;As for perspectives on the future of Machine Learning John recommends chapters 2, 8, and 9 of the free O&#39;Reilly book &lt;a href=&quot;http://www.oreilly.com/data/free/future-of-machine-intelligence.csp&quot;&gt;The Future of Machine Intelligence&lt;/a&gt;.  He also points out that the idea that deep learning does not necessarily mean neural Nets and that it means the number of operations between the input and output. This means that machine learning methods other than neural nets can have a deep architecture.  It&#39;s about the depth itself that learns the complex relationship.  For this he cites &quot;&lt;a href=&quot;https://www-cs.stanford.edu/~acoates/papers/coatesng_nntot2012.pdf&quot;&gt;Learning Feature Representations with K-means (pdf)&lt;/a&gt;&quot; by Adam Coates and Andrew Y. Ng.&lt;/p&gt;&lt;p&gt;Christopher Olah in his post: &quot;&lt;a href=&quot;http://colah.github.io/posts/2015-09-NN-Types-FP/&quot;&gt;Neural Networks, Types, and Functional Programming&lt;/a&gt;&quot; talks about how deep learning is a very young field and that like other young fields in the past things are developed in an ad hoc manner with more of the understanding and formalisms being discovered later.  As he points out we will probably have a very different view of what we are doing in 30 years.   Although that last point is a bit obvious, it still helps to put things in context.  So it is probably hard to tell what will be the most fruitful AI algorithms even ten years from now. &lt;/p&gt;&lt;p&gt;At the end of his talk John touches on a bigger issue that is becoming more ubiquitous in conversations about deep learning and AI:  What are the larger social implications for society? So I thought I would contemplate some possibilities.  &lt;/p&gt;&lt;p&gt;The first and perhaps most imminent and frightening concern is the loss of jobs due to automation.  Many people argue that this is the same fear that was raised especially during the first two industrial revolutions which occurred in the late 18&lt;sup&gt;th&lt;/sup&gt;-early 19&lt;sup&gt;th&lt;/sup&gt; century and the late 19&lt;sup&gt;th&lt;/sup&gt;-early 20&lt;sup&gt;th&lt;/sup&gt; century. Of course how you classify industrial revolutions can vary and can easily be off by one if you include the Roman innovation of &lt;a href=&quot;https://en.wikipedia.org/wiki/Barbegal_aqueduct_and_mill&quot;&gt;water power&lt;/a&gt;.  These industrial revolutions displaced certain skilled jobs by mechanizing work and created new, perhaps less skilled factory jobs.  The third industrial revolution mid-late 20&lt;sup&gt;th&lt;/sup&gt; century can be thought of be the rise of more factory automation and the development of microprocessor which can be described in simple terms as a general electronic controller, of course it is way more than that.  This continued automation lead to many things like specialized robots for manufacturing. This meant still less jobs for people.  Now we are on the cusp of what is being called the fourth industrial revolution with generalized AI algorithms and multipurpose robotics.&lt;/p&gt;&lt;p&gt;I have often heard the argument that this has all happened before.  John brings up a valid point on this which is when it happened before there was a lot more time for society to recover and new jobs were created.  There was an &lt;a href=&quot;http://www.npr.org/sections/money/2015/02/05/382664837/map-the-most-common-job-in-every-state&quot;&gt;article&lt;/a&gt; on NPR identifying truck driver as one of the most common jobs in America.   There is some dispute of this in that the most common jobs are &lt;a href=&quot;http://www.marketwatch.com/story/no-truck-driver-isnt-the-most-common-job-in-your-state-2015-02-12&quot;&gt;retail jobs&lt;/a&gt;.  Regardless of which is the most common job, still there are by some estimates 3.5 million truck driver jobs in the US.  Self driving vehicles are very possibly less than five years away.  That means those jobs, not to mention taxi jobs as well will be lost.  How long before you click purchase on an ecommerce website like Amazon and no humans are involved in that purchase arriving at your house? This might be about that same timeframe.  This is an unprecedented level of automation and it affects many other professions for example some paralegal and radiology jobs are potentially now under threat.  &lt;/p&gt;&lt;p&gt;There is of course an upside. If AI&#39;s become better at medical jobs than humans that could be a good thing.  They won&#39;t be prone to fatigue or human error.  In theory people could liberated from having to perform many tedious jobs as well.   AI&#39;s could usher in new scientific discoveries. Perhaps they could even make many aspects of our society more efficient and more equal.  In this case I for one would welcome our AI overlords.&lt;/p&gt;&lt;p&gt;It is hard to contemplate the future of society without thinking of the work of Orwell and Huxley, this &lt;a href=&quot;https://biblioklept.org/2013/06/08/huxley-vs-orwell-the-webcomic-2/&quot;&gt;comic&lt;/a&gt; sums up some of those concerns and begs the question how much of this do we currently see in our society.  From the Orwellian perspective programs like &lt;a href=&quot;https://en.wikipedia.org/wiki/PRISM_(surveillance_program)&quot;&gt;PRISM&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Utah_Data_Center&quot;&gt;NSA&#39;s Utah Data Center&lt;/a&gt; allow for the collection and storage of our data.  AI&#39;s could comb through this data in ways humans never could. This creates the potential for a powerful surveillance state.  Of course it is about how this power is used or abused that will determine if we go down the trajectory of the Orwellian dystopia.  The other scary aspect of AI&#39;s are idea of automated killer drones, this of course is the Skynet dystopia.  I think we should fear the Elysium dystopia with both aerial and Elysium style enforcement drones.&lt;/p&gt;&lt;p&gt;Maybe we go down the other path with a universal income that frees us from having to perform daily labor to earn our right to live.   How do we now fill our days?  Do we all achieve whatever artistic or intellectual pursuits that we are now free to explore?  What happens if those pursuits can also be done better by the AI&#39;s?  Is there a point in painting a picture or writing and singing a song if you will just be outcompeted by an AI?  Some of this is already possible.  ML algorithms have written reasonable songs, created &lt;a href=&quot;https://en.wikipedia.org/wiki/DeepDream&quot;&gt;artistic images&lt;/a&gt; as well as having written newspaper articles that are mostly indistinguishable from human writers.  Even math and science may fall under their superior abilities for instance &lt;a href=&quot;http://www.nature.com/news/the-biggest-mystery-in-mathematics-shinichi-mochizuki-and-the-impenetrable-proof-1.18509?WT.mc_id=TWT_NatureNew&quot;&gt;Shinichi Mochizuki&#39;s ABC conjecture proof&lt;/a&gt; seems to be incomprehensible by humans.  What if math and science becomes too big and complex for humans to advance it and it becomes the domain of the AI&#39;s?  So in this case do we fall into Huxley&#39;s dystopia?  Actually many people would probably find themselves, as some do now, exclusively pursuing drugs, alcohol, carnal pleasures, porn, video games, tv, movies, celebrity gossip, etc.  So do we all fall into this in spite of our aspirations?  And the AI&#39;s will most likely be able to create all of our entertainment desires including the future synthetic Kim Kardashian style celebs.&lt;/p&gt;&lt;p&gt;Ok so that&#39;s enough gloom and doom. I can&#39;t really say where it will go. Maybe we&#39;ll end up with AI hardware wired directly to our brains and thus be able to take our human potential to new levels. Of course why fight it.  If you can&#39;t beat them join them and the best way to do that is to learn more about deep learning.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM0Xd6QJe52hNAfFDsKfx2KDTacRgNXwZpq_-JfPSxHwgS-pzhK9Aibk0GDkLfUOp46uEmETm7s5bOW1vGaRgv7kW9KrLWW-vuJHclKRMgKwvFntBlougy4qhwPnz0ShzFv30kvq-BeG_A/s1600/101.1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM0Xd6QJe52hNAfFDsKfx2KDTacRgNXwZpq_-JfPSxHwgS-pzhK9Aibk0GDkLfUOp46uEmETm7s5bOW1vGaRgv7kW9KrLWW-vuJHclKRMgKwvFntBlougy4qhwPnz0ShzFv30kvq-BeG_A/s320/101.1.png&quot; width=&quot;320&quot; height=&quot;289&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h1&gt;Deep Learning 101/Getting Started&lt;/h1&gt;&lt;h2&gt;Online Learning Resources&lt;/h2&gt;&lt;p&gt;John mentions a few resources for getting started.  He mentions &lt;a href=&quot;http://colah.github.io/&quot;&gt;Christopher Olah&#39;s blog&lt;/a&gt;, describing him as the Strunk and the White of Deep Learning through his clear communication using a visual language.   I have had his &quot;Neural Networks, Manifolds, and Topology&quot; post on my todo list and I agree that he has a bunch of excellent posts. I admit to being a fan of his visual style from his old blog as my post on &lt;a href=&quot;http://www.elegantcoding.com/2012/10/the-ubiquitous-patterns-of-pascals.html&quot;&gt;Pascal&#39;s Triangle&lt;/a&gt; was partially inspired by his work. His newer work seems to be posted on &lt;a href=&quot;http://distill.pub/&quot;&gt;http://distill.pub/&lt;/a&gt;.  John also mentions &lt;a href=&quot;http://karpathy.github.io/&quot;&gt;Andrej Karpathy&#39;s blog&lt;/a&gt; as well as the Comprehensive Course on Convolutional Neural Nets that he teaches &lt;a href=&quot;http://cs231n.stanford.edu/index.html&quot;&gt;Stanford: CS231n: Convolutional Neural Networks for Visual Recognition&lt;/a&gt;, which can additionally be found &lt;a href=&quot;http://cs231n.github.io/neural-networks-1/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Additionally John did a write up &quot;&lt;a href=&quot;http://www.datacommunitydc.org/blog/2014/05/deep-learning-courses&quot;&gt;Where are the Deep Learning Courses?&lt;/a&gt; after his first DSDC talk.&lt;/p&gt;&lt;p&gt;If you are local we also have the &lt;a href=&quot;https://www.meetup.com/DC-Deep-Learning-Working-Group/&quot;&gt;DC-Deep-Learning-Working-Group&lt;/a&gt; they are currently working through the Richard Socher Stanford NLP course.&lt;/p&gt;&lt;h2&gt;Some Additional Resources &lt;/h2&gt;&lt;p&gt;I wanted to include some additional resources and came up with a list that I asked John&#39;s opinion on.  These are some that I found that he endorses with high recommendations for Richard Socher&#39;s NLP tutorial.&lt;/p&gt;&lt;p&gt;Neural Networks and Deep Learning By Michael Nielsen &lt;a href=&quot;http://neuralnetworksanddeeplearning.com/&quot;&gt;http://neuralnetworksanddeeplearning.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Deep Learning by Ian Goodfellow and Yoshua Bengio and Aaron Courville &lt;a href=&quot;http://www.deeplearningbook.org/&quot;&gt;http://www.deeplearningbook.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.udacity.com/course/deep-learning--ud730&quot;&gt;UDACITY : Deep Learning by Google&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.socher.org/index.php/DeepLearningTutorial/DeepLearningTutorial&quot;&gt;ACL 2012 + NAACL 2013 Tutorial: Deep Learning for NLP (without Magic)&lt;/a&gt;, Richard Socher, Chris Manning and Yoshua Bengio&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://cs224d.stanford.edu/&quot;&gt;CS224d: Deep Learning for Natural Language Processing&lt;/a&gt;, Richard Socher&lt;/p&gt;&lt;p&gt;These are the additional resources that looked interesting to me: &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://nikhilbuduma.com/2014/12/29/deep-learning-in-a-nutshell/&quot;&gt;Deep Learning in a Nutshell by Nikhil Buduma&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Deep Learning Video Lectures by Ruslan Salakhutdinov, Department of Statistical Sciences, University of Toronto:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://videolectures.net/deeplearning2015_salakhutdinov_deep_learning/&quot;&gt;Lecture 1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;videolectures.net/deeplearning2015_salakhutdinov_deep_learning_2/&quot;&gt;Lecture 2&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=F1ka6a13S9I&quot;&gt;Nuts and Bolts of Applying Deep Learning (Andrew Ng)(video)&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;Core Concepts &lt;/h2&gt;&lt;p&gt;I wanted to list out some core concepts that one might consider learning. I reached out to John with a list of concepts.  He replied with some that he thought were important and pointed out that such a list can grow rapidly and it is better to take a more empirical approach and learn as you go by doing.  I think a brief list might be helpful to people new to machine learning and deep learning.&lt;/p&gt;&lt;p&gt;Some basic ML concepts might include: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Linear_separability&quot;&gt;Linear separability&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Hyperplane&quot;&gt;Hyperplane&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Overfitting&quot;&gt;Overfitting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Sigmoid_function&quot;&gt;Sigmoid Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://machinelearningmastery.com/supervised-and-unsupervised-machine-learning-algorithms/&quot;&gt;Supervised vs Unsupervised&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Cost_function&quot;&gt;Cost Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Cluster_analysis&quot;&gt;Cluster analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Statistical_classification&quot;&gt;Statistical classification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Linear_classifier&quot;&gt;Linear classifier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Curse_of_dimensionality&quot;&gt;Curse of dimensionality&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;These are some that are more specific to Neural Nets:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Recurrent_neural_network&quot;&gt;Recurrent neural network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Convolutional_neural_network&quot;&gt;Convolutional neural network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://colah.github.io/posts/2015-08-Understanding-LSTMs/&quot;&gt;Long short-term memory (LSTM) recurrent neural network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Rectifier_(neural_networks)&quot;&gt;ReLu&#39;s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Generative_model&quot;&gt;Generative models&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Generative_adversarial_networks&quot;&gt;Generative adversarial networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Softmax_function&quot;&gt;Softmax Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Activation_function&quot;&gt;Activation Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Vanishing_gradient_problem&quot;&gt;Vanishing gradient problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Backpropagation&quot;&gt;Backpropagation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Some additional areas that might be of interest are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://stats.stackexchange.com/questions/56950/neural-network-with-skip-layer-connections&quot;&gt;Skipping layers in convnets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html&quot;&gt;Inceptionism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Word2vec&quot;&gt;Learning from word sequences a la word2vec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1502.03167&quot;&gt;Batch Normalization&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Additionaly a couple of articles that lay out some core concepts are &lt;a href=&quot;https://www.analyticsvidhya.com/blog/2016/08/evolution-core-concepts-deep-learning-neural-networks/&quot;&gt;The Evolution and Core Concepts of Deep Learning &amp;amp; Neural Networks&lt;/a&gt; and &lt;a href=&quot;https://devblogs.nvidia.com/parallelforall/deep-learning-nutshell-core-concepts/&quot;&gt;Deep Learning in a Nutshell: Core Concepts&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Git Clone, Hack, and Repeat&lt;/h2&gt;&lt;p&gt;John mentions the approach of Git Clone, Hack, and Repeat.  I asked him if there were and there any specific github repo&#39;s that you would recommend?  I am just using his reply here, with some of the links and descriptions filled in:&lt;/p&gt;&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;This is really, choose your own adventure, but when I look in my history for recent git clone references, I see:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://torch.ch/&quot;&gt;Torch&lt;/a&gt; is a scientific computing framework for with wide support for machine learning algorithms that puts GPUs first. It is easy to use and efficient, thanks to an easy and fast scripting language, LuaJIT, and an underlying C/CUDA implementation. &lt;a href=&quot;https://github.com/torch&quot;&gt;github&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jcjohnson/torch-rnn&quot;&gt;Efficient, reusable RNNs and LSTMs for torch&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/deepmind/torch-hdf5&quot;&gt;Torch interface to HDF5 library&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://tensorflow.org&quot;&gt;Computation using data flow graphs for scalable machine learning&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/tensorflow/tensorflow&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/tensorflow/tensorflow&quot;&gt;This repository contains IPython Notebook with sample code, complementing Google Research blog post&lt;/a&gt;&lt;a href=&quot;https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html&quot;&gt;&lt;/a&gt; about Neural Network art.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/google/deepdream&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://carpedm20.github.io/faces/&quot;&gt;Neural Face uses Deep Convolutional Generative Adversarial Networks (DCGAN)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/carpedm20/DCGAN-tensorflow&quot;&gt;A tensorflow implementation of &quot;Deep Convolutional Generative Adversarial Networks&quot;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Among others--playing with OpenAI&#39;s universe and pix2pix both seem full of possibilities, too. &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/phillipi/pix2pix&quot;&gt;Image-to-image translation using conditional adversarial nets&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://universe.openai.com/&quot;&gt;Openai Universe&lt;/a&gt;&lt;/p&gt;&lt;p&gt;To learn, I&#39;m a big advocate of finding a big enough dataset you like and then trying to find interesting patterns in it--so the best hacks will usually end up combining elements of multiple repos in new ways. A bit of prosaic guidance I seem to find myself repeating a lot: always try to first reproduce what the author did; then start hacking. No sense practicing machine learning art when there&#39;s some dependency, sign error, or numerical overflow or underflow that needs fixing first. And bugs are everywhere.&lt;/p&gt;&lt;/blockquote&gt;&lt;h3&gt;Data Sets&lt;/h3&gt;&lt;p&gt;I asked John to recommend some data sets for getting into deep learning, he recommended the following:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://yann.lecun.com/exdb/mnist/&quot;&gt;MNIST&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.cs.toronto.edu/~kriz/cifar.html&quot;&gt;CIFAR-10&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.cs.nyu.edu/~ylclab/data/norb-v1.0/&quot;&gt;NORB &lt;/a&gt;&lt;/p&gt;&lt;p&gt;Andrej Karpathy&#39;s blog post &quot;&lt;a href=&quot;http://karpathy.github.io/2015/05/21/rnn-effectiveness/&quot;&gt;The Unreasonable Effectiveness of Recurrent Neural Networks&lt;/a&gt;&quot; provides some examples using a Shakespeare corpus, wikipedia data, and linux kernel code that can illustrate a lot of really interesting properties of RNNs&lt;/p&gt;&lt;h3&gt;Deep Learning Frameworks&lt;/h3&gt;&lt;p&gt;He also mentions a number of Deep Learning frameworks to look at for getting into deep learning, the top three are &lt;a href=&quot;https://www.tensorflow.org/&quot;&gt;tensorflow&lt;/a&gt;, &lt;a href=&quot;http://caffe.berkeleyvision.org/&quot;&gt;caffe&lt;/a&gt; and &lt;a href=&quot;https://keras.io/&quot;&gt;Keras&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As I was writing this I saw this: &quot;&lt;a href=&quot;http://www.fast.ai/2017/01/03/keras/&quot;&gt;Google Tensorflow chooses Keras&lt;/a&gt;&quot;. This makes Keras the first high-level library added to core TensorFlow at Google, which will effectively make it TensorFlow&#39;s default API.&lt;/p&gt;&lt;h2&gt;Building Deep Learning Systems&lt;/h2&gt;&lt;p&gt;One area of interest to me is how to build better software. In traditional software development tests area used to help verify a system.  In these instances you can usually expect known inputs to yield known outputs.  This is something that software developers strive for and is increased by things like referential transparency and immutability.   However, how do you now handle systems that behave probabilisticly instead of discretely?    As I was researching the topic of how do you successfully test and deploy ML systems, I found these two resources:  &quot;&lt;a href=&quot;https://research.google.com/pubs/pub45742.html&quot;&gt;What&#39;s your ML test score? A rubric for ML production systems&lt;/a&gt;&quot; and &quot;&lt;a href=&quot;http://martin.zinkevich.org/rules_of_ml/rules_of_ml.pdf&quot;&gt;Rules of Machine Learning:Best Practices for ML Engineering(pdf) &lt;/a&gt;&quot;. I asked John his thoughts on this and he recommended: &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.675.9675&quot;&gt;Machine Learning: The High-Interest Credit Card of Technical Debt&lt;/a&gt;&quot; as well as &quot;&lt;a href=&quot;https://openai.com/blog/infrastructure-for-deep-learning/&quot;&gt;Infrastructure for Deep Learning&lt;/a&gt;&quot;, although he said this is more of a metaphor us normal humans that don&#39;t have Altman/Musk funded budgets.  He also pointed out that building these types of systems also fall under the standard best practices approach to any software and trying to maintain high software development standards is just as helpful as in any project.&lt;/p&gt;&lt;h1&gt;Final Thoughts&lt;/h1&gt;&lt;p&gt;My contemplation of the future is pretty pessimistic from the societal perspective.  From the AI perspective it is pretty optimistic on what can be done.  New articles about AI achievements like &quot;&lt;a href=&quot;news.stanford.edu/2017/01/25/artificial-intelligence-used-identify-skin-cancer/&quot;&gt;Deep learning algorithm does as well as dermatologists in identifying skin cancer&lt;/a&gt;&quot; are constantly appearing.  However, then you see things like &quot;&lt;a href=&quot;http://news.softpedia.com/news/medical-equipment-crashes-during-heart-procedure-because-of-antivirus-scan-503642.shtml&quot;&gt;Medical Equipment Crashes During Heart Procedure Because of Antivirus Scan&lt;/a&gt;&quot;.  Although this is not related to Deep Learning it does touch on a well known issue, which is our lives are effectively run by software and we still don&#39;t really know how to truly engineer it.  From what I understand, we really don&#39;t know exactly how some of these deep learning algorithms work.  This makes the future of our software and AI seem even more uncertain. Hopefully we will overcome that.  &lt;/p&gt;&lt;p&gt;Lastly I wanted thank John for being very generous with his time in helping me with additional resources for this post. &lt;a href=&quot;add DSDC folks too&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;References and Further Reading&lt;/h1&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.scholarpedia.org/article/Recurrent_neural_networks&quot;&gt;Recurrent neural networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1404.7828&quot;&gt;Deep Learning in Neural Networks: An Overview&lt;/a&gt;, Juergen Schmidhuber&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://synecdoche.liber118.com/beyond-the-ai-winter-941c0a66b4f5#.gx9qdt5vx&quot;&gt;Beyond the AI Winter&lt;/a&gt;, Paco Nathan&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=0tmNf6ec2kU&quot;&gt;DNA - Secret of Photo 51 (NOVA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.forbes.com/sites/bernardmarr/2016/02/19/a-short-history-of-machine-learning-every-manager-should-read/print/&quot;&gt;A Short History Of Deep Learning – Every Manager Should Read&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.andreykurenkov.com/writing/a-brief-history-of-neural-nets-and-deep-learning/&quot;&gt;A &#39;Brief&#39; History of Neural Nets and Deep Learning, Part 1, Andrey Kurenkov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/BINA48&quot;&gt;BINA48&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.slideshare.net/LuMa921/deep-learning-the-past-present-and-future-of-artificial-intelligence&quot;&gt;Deep Learning - The Past, Present and Future of Artificial Intelligence&lt;/a&gt;, Lukas Masuch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.math.uni-bielefeld.de/documenta/vol-ismp/52_griewank-andreas-b.pdf&quot;&gt;Who Invented the Reverse Mode of Differentiation? (pdf)&lt;/a&gt;, Andreas Griewank &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Timeline_of_machine_learning&quot;&gt;Timeline of machine learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.nvidia.com/parallelforall/deep-learning-nutshell-history-training/&quot;&gt;Deep Learning in a Nutshell: History and Training&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.nvidia.com/parallelforall/deep-learning-nutshell-sequence-learning/&quot;&gt;Deep Learning in a Nutshell: Sequence Learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://andyljones.tumblr.com/post/110998971763/an-explanation-of-xavier-initialization&quot;&gt;An Explanation of Xavier Initialization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf&quot;&gt;Understanding the difficulty of training deep feedforward neural networks (pdf)&lt;/a&gt; Xavier Glorot, Yoshua Bengio &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wired.com/2016/04/openai-elon-musk-sam-altman-plan-to-set-artificial-intelligence-free/&quot;&gt;Inside OpenAI, Elon Musk&#39;s Wild Plan to Set Artificial Intelligence Free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://deeplearning.net/reading-list/&quot;&gt;Deep Learning Reading List&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot; https://jeremykun.com/2012/12/09/neural-networks-and-backpropagation/&quot;&gt;Neural Networks and the Backpropagation Algorithm&lt;/a&gt; by Jeremy Kun&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1312.5602&quot;&gt;Playing Atari with Deep Reinforcement Learning&lt;/a&gt; Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Alex Graves, Ioannis Antonoglou, Daan Wierstra, and Martin Riedmiller&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.technologyreview.com/s/513696/deep-learning/&quot;&gt;10 Breakthrough Technologies : Deep Learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://deeplearningworkshopnips2010.files.wordpress.com/2010/09/nips10-workshop-tutorial-final.pdf&quot;&gt;NIPS 2010 Workshop on Deep Learning and Unsupervised Feature Learning Tutorial on Deep Learning and Applications (pdf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=wZfVBwOO0-k&quot;&gt;Adam Coates -- Demystifying Unsupervised Feature Learning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://arxiv.org/abs/1406.2661&quot;&gt;Generative Adversarial Networks(pdf)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openai.com/blog/generative-models/&quot;&gt;Open AI Blog Generative Models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-041-probabilistic-systems-analysis-and-applied-probability-fall-2010/&quot;&gt;MIT OpenCourseWare: Probabilistic Systems Analysis and Applied Probability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab&quot;&gt;Essence of linear algebra(videos)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oreilly.com/learning/hello-tensorflow&quot;&gt;Hello, TensorFlow! Building and training your first TensorFlow graph from the ground up.&lt;/a&gt; by Aaron Schumacher&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.usenix.org/system/files/conference/osdi16/osdi16-abadi.pdf&quot;&gt;TensorFlow: A System for Large-Scale Machine Learning (pdf)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Some Leading Deep Learning Researcher&#39;s Links&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.iro.umontreal.ca/~bengioy/yoshua_en/&quot;&gt;Yoshua Bengio&#39;s Home Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://research.google.com/pubs/jeff.html&quot;&gt;Jeff Dean&#39;s Publications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.toronto.edu/~hinton/papers.html&quot;&gt;Geoffrey Hinton&#39;s Publications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cs.stanford.edu/people/karpathy/&quot;&gt;Andrej Karpathy Home Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.toronto.edu/~kriz/&quot;&gt;Alex Krizhevsky&#39;s University Of Toronto&#39;s home page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cs.stanford.edu/~quocle/&quot;&gt;Quoc V. Le Publications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yann.lecun.com/exdb/publis/index.html#fulllist&quot;&gt;Yan LeCun&#39;s Publications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vision.stanford.edu/feifeili/&quot;&gt;Fei-Fei Li&#39;s Home Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.andrewng.org/&quot;&gt;Andrew Ng&#39;s Home Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.cmu.edu/~rsalakhu/&quot;&gt;Ruslan Salakhutdinov&#39;s Home Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.toronto.edu/~ilya/pubs/&quot;&gt;Ilya Sutskever&#39;s Publications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;</description><link>http://www.elegantcoding.com/2017/02/data-science-dc-deep-learning-past.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEielpyRTO7ummQotqJ_ItqKK3V2wJ22samlsZJIdZA43Ii8qjEaWTIGgE0-N-hsnM7hyzDzu1CgKT2GInPiJyu_cPONbOyDZB76YXcU5npMWSq0XCk5Om6_tyRO6bbs9ke8S5tW8NuZzkbY/s72-c/MoMa_10.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-7422460570579212125</guid><pubDate>Mon, 26 Sep 2016 14:31:00 +0000</pubDate><atom:updated>2016-09-26T10:41:44.574-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software Complexity</category><category domain="http://www.blogger.com/atom/ns#">Software Development</category><category domain="http://www.blogger.com/atom/ns#">Software Development Teams</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><category domain="http://www.blogger.com/atom/ns#">Software Process</category><title>Software Development is a Risky Business</title><description>&lt;div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsnPpNiT2inAWSHQcAtQnSRRAIW6bPQEJyIXb-ird8t2Rondnux8uHzHXWrQ5Yj_HUj-aXnhje15DFsStCl6-VWbAF7catjzSTwYe9VNQNb5O7IWrNbP-HVsRjNTn-jcbX5I4lWHCHTrSV/s1600/Train_wreck_at_Montparnasse_1895.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsnPpNiT2inAWSHQcAtQnSRRAIW6bPQEJyIXb-ird8t2Rondnux8uHzHXWrQ5Yj_HUj-aXnhje15DFsStCl6-VWbAF7catjzSTwYe9VNQNb5O7IWrNbP-HVsRjNTn-jcbX5I4lWHCHTrSV/s400/Train_wreck_at_Montparnasse_1895.jpg&quot; width=&quot;334&quot; height=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;!-- Software Development is a Risky Business --&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Software projects are inherently risky.  Some statistics show that roughly seventy percent to fifty percent of software projects get classified as “challenged”.   Where challenged can mean cost overruns and/or delivery delays, or it can mean complete failure and the cancellation of the project.  Some statistics indicate as the size of the project increases so does the probability of problems and failure.  Many articles and blog posts have been written about the long history of software project failure.  At the time of writing this post the most recent and very public software project debacle was the healthcare.gov project.  It seems as IT becomes more pervasive and essential the problems with projects may be getting worse not better.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In spite of these numbers and all too often in my experience I have found that individuals and organizations seem to have a very optimistic outlook about their own projects especially at the beginning of the project.  Perhaps it’s the classic: “that won’t happen to me” attitude.  Even as projects start to run into problems I have seen people especially managers not take issues seriously or ignore them all together.  In some of the analysis of healthcare.gov, &lt;a href=&quot;http://www.govhealthit.com/news/healthcaregovs-fatal-mistake&quot;&gt;this was cited as one of the problems&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Risk_management&quot;&gt;Risk management&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Risk_analysis&quot;&gt;risk assessment/analysis&lt;/a&gt; are developed areas in project management and engineering and are often discussed in software projects.  Many risks will end up falling into two categories.  One category is actual risks to the end product, such as unforeseen security vulnerabilities in software systems or other engineering issues that lead to flaws or critical failures of the system or components. The other is risks in the management and execution of constructing product or system.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Risk management is one of those areas where the engineering aspects and the engineering management aspects can become tightly coupled.  An example can be derived from the XKCD comic “Tasks”: &lt;a href=&quot;https://xkcd.com/1425/&quot;&gt;&lt;span style=&#39;color:windowtext;text-decoration: none&#39;&gt;https://xkcd.com/1425/&lt;/span&gt;&lt;/a&gt;.  Now the point of this comic is to demonstrate the difference between an easy problem and hard one, and presumably the conversation takes place between a manager and developer.  In a risk setting, perhaps solving the hard problem is the goal of the project.  So a risk might be that the research team fails to solve that problem at the end of the five years, or that it takes ten. So in a sense the task is high risk but there are team related risks, maybe the budget is too low and the team is subpar due to low salaries so they can never even solve it.  Another possible scenario is that the conversation never happened and the project management and team think it is solvable in six months.  This second scenario is the risk I have seen though out most of my career, the project management and team are overly optimistic or really don’t have a good understanding of the complexity of the task at hand.  In some cases these types of issues seem to be due in part to &lt;a href=&quot;http://en.wikipedia.org/wiki/Pluralistic_ignorance&quot;&gt;pluralistic ignorance&lt;/a&gt;.  Often in cases where developers don’t want to contradict management.  There’s a great dramatization of this type of behavior in the show Silicon Valley when the Hooli developers are working on the Nucleus project, where the information is conveyed up the management chain but nobody wants to tell Gavin the truth. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Sadly it seems like the risks that are identified are almost peripheral to the real risks on projects.  It is usually things like the hardware delivery will be delayed which will delay setting up our dev/test/prod environments and delay the start of development.  While these are legitimate risks, there is always the risk of all of the unknowns that will cause delays and cost over runs, even things like developer turnover never seem to be taken into account, at least in my experience.  Also there seems to no cognizance of the long term cost risks like the project was poorly managed or rushed or was done on the cheap which caused the delivered codebase to be an unmaintainable big ball of mud that will incur a much higher long term costs.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In order for software engineering to grow up and become a real engineering discipline it will need formal risk assessment and risk management methodologies both on the project management side and on the work product side.  This is also an area where ideas and methodologies can potentially be taken from existing work in other engineering disciplines.  These methodologies will also most likely draw from probability and game theory.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;References and Further Reading&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.nytimes.com/2013/11/19/us/politics/administration-open-to-direct-insurance-company-signups.html?pagewanted=all&amp;amp;_r=0&quot;&gt;Officials Were Warned About Health Site Woes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.hatch.senate.gov/public/_cache/files/e3ff7336-426b-4363-ad41-086ee120a2f1/HealthCare.gov%20REPORT.pdf&quot;&gt;Red Flags: How Politics and Poor Management Led to the Meltdown of HealthCare.gov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.healthcareitnews.com/news/senate-details-healthcaregov-crash&quot;&gt;Senate details HealthCare.gov crash&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.forbes.com/sites/lorenthompson/2013/12/03/healthcare-gov-diagnosis-the-government-broke-every-rule-of-project-management/&quot;&gt;HealthCare.gov Diagnosis: The Government Broke Every Rule Of Project Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.govhealthit.com/news/healthcaregovs-fatal-mistake&quot;&gt;HealthCare.gov&#39;s fatal mistake&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://spectrum.ieee.org/static/the-staggering-impact-of-it-systems-gone-wrong&quot;&gt;The Staggering Impact of IT Systems Gone Wrong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://calleam.com/WTPF/?page_id=1445&quot;&gt;Why Do Projects Fail?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thisiswhatgoodlookslike.com/2012/06/10/gartner-survey-shows-why-projects-fail/&quot;&gt;Gartner Survey Shows Why Projects Fail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zdnet.com/article/study-68-percent-of-it-projects-fail/&quot;&gt;Study: 68 percent of IT projects fail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.drdobbs.com/architecture-and-design/the-non-existent-software-crisis-debunki/240165910&quot;&gt;The Non-Existent Software Crisis: Debunking the Chaos Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.projectsmart.co.uk/why-software-projects-fail.php&quot;&gt;Why Software Projects Fail and How to Make Them Succeed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.projectsmart.co.uk/docs/chaos-report.pdf&quot;&gt;The Standish Group Report CHAOS Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.computerworld.com/article/2493658/it-management/the-scariest-software-project-horror-stories-of-2012.html&quot;&gt;The scariest software project horror stories of 2012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ambysoft.com/surveys/success2013.html&quot;&gt;2013 IT Project Success Rates Survey Results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.capterra.com/surprising-project-management-statistics/&quot;&gt;14 Surprising Project Management Statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://spectrum.ieee.org/riskfactor/aerospace/aviation/what-is-the-true-state-of-faas-en-route-automation-modernization-program&quot;&gt;FAA’s Modernization Program: Clear Skies, or Still In Heavy Turbulence?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoworld.com/article/2672020/application-development/anatomy-of-an-it-disaster--how-the-fbi-blew-it.html&quot;&gt;Anatomy of an IT disaster: How the FBI blew it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://spectrum.ieee.org/computing/software/why-software-fails&quot;&gt;Why Software Fails&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.codinghorror.com/the-long-dismal-history-of-software-project-failure/&quot;&gt;The Long, Dismal History of Software Project Failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zdnet.com/blog/projectfailures/cio-analysis-why-37-percent-of-projects-fail/12565&quot;&gt;CIO analysis: Why 37 percent of projects fail: New research identifies five important reasons that projects fail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://faethcoaching.com/it-project-failure-rates-facts-and-reasons/&quot;&gt;IT Project Failure Rates: Facts and Reasons&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2016/09/software-development-is-risky-business.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsnPpNiT2inAWSHQcAtQnSRRAIW6bPQEJyIXb-ird8t2Rondnux8uHzHXWrQ5Yj_HUj-aXnhje15DFsStCl6-VWbAF7catjzSTwYe9VNQNb5O7IWrNbP-HVsRjNTn-jcbX5I4lWHCHTrSV/s72-c/Train_wreck_at_Montparnasse_1895.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-6283937175569646737</guid><pubDate>Tue, 31 May 2016 20:34:00 +0000</pubDate><atom:updated>2016-05-31T16:34:29.485-04:00</atom:updated><title>My Ant Symbiosis Stories</title><description>&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJaXpMgP7NaqTcBzMHzz3qgrcfkLlkdkz6XzMei1EI84DzmZWsnnk7H0F9P8pl-uLr2JPgArtEydeUQgHE-8nnqSQilu8gBBgx4u5qRaCyIqkhfeWF2gg0dLupeArfi5ZLJDAemE7p_Qi/s1600/Top+Photo.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJaXpMgP7NaqTcBzMHzz3qgrcfkLlkdkz6XzMei1EI84DzmZWsnnk7H0F9P8pl-uLr2JPgArtEydeUQgHE-8nnqSQilu8gBBgx4u5qRaCyIqkhfeWF2gg0dLupeArfi5ZLJDAemE7p_Qi/s1600/Top+Photo.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!-- My Ant Symbiosis Stories --&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;This post is a little off topic from my normal posts.  Although, since I consider my blog to be about programming, software engineering, math and computer science, perhaps taking a brief foray into the natural sciences is warranted as it is science and I am a science nerd, and of course it is my blog.  The book that I am referencing for this post is: &lt;u&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Ants&quot;&gt;The Ants&lt;/a&gt;&lt;/u&gt; by &lt;a href=&quot;https://en.wikipedia.org/wiki/E._O._Wilson&quot;&gt;E.O. Wilson&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Bert_H%C3%B6lldobler&quot;&gt;Bert Hölldobler&lt;/a&gt;. It has many great examples of data visualization.  There is also a CS relevant area of study called ant hill algorithms.  Additionally, I believe that the study of social biology is basically just game theory which again is a topic that comes up in CS.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The natural world is fascinating and it teams with many interesting life and death stories that play out every minute of every day in the theatre of nature.  Some of the most fascinating plots include various types of symbiosis that occur between species. &lt;a href=&quot;https://en.wikipedia.org/wiki/Symbiosis&quot;&gt;Symbiosis&lt;/a&gt;, also called mutualism, is a cooperative relationship between two species that sometimes includes an exchange of “survival favors”.  A fairly famous example of this type of species interdependence is the story of why Brazil nuts produce very poorly in plantations.  It turns out the Brazil nut tree &lt;a href=&quot;http://en.wikipedia.org/wiki/Brazil_nut&quot;&gt;Bertholletia excelsa&lt;/a&gt; is dependent on a pollinator insect, an orchid bee &lt;a href=&quot;http://en.wikipedia.org/wiki/Euglossa&quot;&gt;Euglossa&lt;/a&gt;, which is attracted by an orchid, &lt;a href=&quot;http://en.wikipedia.org/wiki/Coryanthes&quot;&gt;Coryanthes Vasquezii&lt;/a&gt;  which does not grow on the tree but is present in the &lt;a href=&quot;http://thebrazilnutstory.wordpress.com/pollination/&quot;&gt;undisturbed forest habitat&lt;/a&gt;.  Finally the tough outer shell needs large rodents like the &lt;a href=&quot;http://en.wikipedia.org/wiki/Common_Agouti&quot;&gt;Agouti&lt;/a&gt; to gnaw it open, they much like squirrels consume some of the seeds and also bury some for later which allows some of the forgotten seeds to germinate.  There are many examples of symbiotic relationships in rainforest and other habitats.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ants are notorious for having symbiotic relationships with plants and other insects and many such cases are well documented. One case is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Neotropics&quot;&gt;Neotropical&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Cecropia&quot;&gt;Cecropia tree&lt;/a&gt; which provides hollow stems for Azteca ants to inhabit and even food in the form of gylcogen-rich &lt;a href=&quot;http://www.marietta.edu/~biol/costa_rica/animals/cecropia_ants.htm&quot;&gt;Müllerian bodies&lt;/a&gt;.  There was another story about a relatively recent discovery of a &lt;a href=&quot;http://blogs.discovermagazine.com/notrocketscience/2012/09/12/ancient-flower-lives-only-on-two-spanish-cliffs-and-uses-ants-to-survive/&quot;&gt;plant that grows on the harsh cliffs of Pyrenees&lt;/a&gt; that depends on three species of ants for pollination and seed dispersal.  These types of stories are not uncommon in the natural world, however, one often reads of them playing out in the above and often exotic and/or tropical locations, so I found myself rather surprised to discover this type of drama transpiring literally inches from my living room window in suburban Arlington Virginia.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The story I am going to tell happened during the summer of 2011 and I had originally labored under the assumption that it was a somewhat unique undocumented story.  However, my subsequent research has yielded a number of pictures which depict many of the events that I will describe and show here often with better photographic quality than what I what I captured.  Not that my photos are bad but they lack the fidelity of others I have seen.  I make up for this in quantity which captures various events over an extended period of time.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;One of my hobbies is identifying eastern forest native plants and experimenting with growing them in my yard.  This activity, probably to the chagrin of my mcmansioned neighbors, has turned my yard into a small native plant and wildlife habit.   A few years ago I collected some seeds of a plant known as Yellow Leaf Cup, Bearpaw, or Bearsfoot, which I believe goes by the Latin name Smallanthus Uvedalia formerly known as Polymnia Uvedalia.  It is in the Aster Family (&lt;a href=&quot;http://en.wikipedia.org/wiki/Asteraceae&quot;&gt;Asteraceae&lt;/a&gt;).  I planted some in pots and scattered some seeds in my yard, the potted ones germinated but did not make it however some took root right in front of my living room window.  To me this plant really stands out, for a temperate zone plant it has very large leaves, 12 to 18 inches long, and as a result it almost completely obscures my living room window shrouding it in giant green veined leaves as you can see in the picture at the top of this post.  The location of these leaves put me in a unexpected and unique position to watch an incredible and probably &lt;a href=&quot;http://en.wikipedia.org/wiki/Epoch_%28geology%29&quot;&gt;epoch&lt;/a&gt; old symbiotic drama of nature play out between Ants(&lt;a href=&quot;http://en.wikipedia.org/wiki/Hymenoptera&quot;&gt;Hymenopterans&lt;/a&gt;) and &lt;a href=&quot;http://en.wikipedia.org/wiki/Hemiptera&quot;&gt;Hemipterans&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In June 2011 as the stand of Large Flowered Leaf-Cup reached about eight or ten feet in height and completely blocked my living-room window providing a nice screen of green privacy, an odd looking insect, pictured below, showed up.  As you can see it’s shaped like a thorn which has garnered its ilk the general common name of &lt;b&gt;thorn bug&lt;/b&gt; it is also referred to as a &lt;b&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Treehopper&quot;&gt;tree hopper&lt;/a&gt;&lt;/b&gt; this class of insects that falls under the order Hemiptera, and I believe it is the species &lt;a href=&quot;http://bugguide.net/node/view/10205&quot;&gt;Entylia carinata&lt;/a&gt;. It does not have a common name.  I think it needs a common name and in that picture I see a rhinoceros looking insect, thus I am coining it the &lt;b&gt;rhinoceros thorn bug&lt;/b&gt; or just the shorter version of &lt;b&gt;rhino thorn bug&lt;/b&gt;.  If you look closely at the picture below you can see its eyes and legs which are hard to see in many of the photos, my guess is this is by design as thorns don’t have eyes and legs.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrmst1VHzQbIexX1DfeBRqmn13f8IRCbnd712Fbg9wU5sm7GN__I4HcxzeN2WpHXomoH9Phq6sHvUm-zVnd473CQzUq6rW-w6mBmnueupbUvkBETFHOb080F2WAYgcElhyphenhyphen1MU4R4pf_5Q/s1600/RTB.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrmst1VHzQbIexX1DfeBRqmn13f8IRCbnd712Fbg9wU5sm7GN__I4HcxzeN2WpHXomoH9Phq6sHvUm-zVnd473CQzUq6rW-w6mBmnueupbUvkBETFHOb080F2WAYgcElhyphenhyphen1MU4R4pf_5Q/s1600/RTB.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Shortly after its arrival the ants showed up to tend to it:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbyDutUuDMO2T7lRu8Xu1jy4FWmy9DtZJ_lXTT0-eLuoxHVY8XucgXcUpVejZ5wdIE2WhC2RBbVEkw8Gylbt3O-GUmPDfWzltWruUSt6Fqf3bgZUaaye-mJA_NychGAp6f-bMMUs73qnI7/s1600/RTB+Ant.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbyDutUuDMO2T7lRu8Xu1jy4FWmy9DtZJ_lXTT0-eLuoxHVY8XucgXcUpVejZ5wdIE2WhC2RBbVEkw8Gylbt3O-GUmPDfWzltWruUSt6Fqf3bgZUaaye-mJA_NychGAp6f-bMMUs73qnI7/s1600/RTB+Ant.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I contacted a biologist who specializes in ants and he identified them as a species of carpenter ants in the genus &lt;a href=&quot;https://en.wikipedia.org/wiki/Carpenter_ant&quot;&gt;Camponotus&lt;/a&gt;. He told me the possible species for this area are: &lt;a href=&quot;http://en.wikipedia.org/wiki/Camponotus_pennsylvanicus&quot;&gt;Pennsylvanicus&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Camponotus_nearcticus&quot;&gt;Nearcticus&lt;/a&gt;, and &lt;a href=&quot;http://www.antwiki.org/wiki/Camponotus_subbarbatus&quot;&gt;Subbarbatus&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Over the following months I watched the interesting drama play out with these two species. Owning a copy &lt;u&gt;The Ants&lt;/u&gt; gave some perspective to the traits and behaviors of these species.  Over time I captured over one thousand pictures of what played out between these two species.  This collection is really a dataset of photos and it revealed some interesting observations, which while not novel, still make for an interesting story.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Rhino Thorn Bugs: Masters of Camouflage &lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;First let’s start with how Rhino Thorn Bug disguises itself.  A number of the photos of it were taken in different lighting conditions.  In the above photos the light is more direct and the yellow and green “veins” of both the plant and insect mesh and it looks like a thorn on the stem.  In the following lighting the Rhino Thorn Bug appears to have purplish veins that blend with the background of plant veins. &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcsn1SklOL2ariUyCLdeZF38IDqNMloA1LDyUVfQqI0ubo_Sb6e79otRNenWdx7oMPzXDrWV2zZnzcRACgPK-K2XbiWXsSdnU1Bg3p2OtsxSrE9TMCDMN1cABqeWBy49qhNQyq0Tymg3Tt/s1600/Back-camo.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcsn1SklOL2ariUyCLdeZF38IDqNMloA1LDyUVfQqI0ubo_Sb6e79otRNenWdx7oMPzXDrWV2zZnzcRACgPK-K2XbiWXsSdnU1Bg3p2OtsxSrE9TMCDMN1cABqeWBy49qhNQyq0Tymg3Tt/s1600/Back-camo.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt; Another outcome of the Rhino Thorn Bug living on smallanthus uvedalia is the damage to the leaves which also makes for a nice abstract photo:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLtpqBgVIBYFqjnDPEr1_tS8ZTC283b71QODl3E5T0sNI1KW8k57iI3oOxTayI7M_AXUU1N5_qaIGMf6IY6kDvNBdxcoUEeu9UFySVDtuiMBYFWgjVWDvewnp_q258oxBg_Kz8io9pk0Aa/s1600/Abstract.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLtpqBgVIBYFqjnDPEr1_tS8ZTC283b71QODl3E5T0sNI1KW8k57iI3oOxTayI7M_AXUU1N5_qaIGMf6IY6kDvNBdxcoUEeu9UFySVDtuiMBYFWgjVWDvewnp_q258oxBg_Kz8io9pk0Aa/s1600/Abstract.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I’m making a leap here, but it seems that this damage extends the camouflage range for the rhino thorn bug such that it can hang out on the leaf and look like damaged parts of the leaf that more closely match its brownish color and pseudo-veins in back lit conditions:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGwRei-nKpbq3kkpH-8POKGLE3UhmB2Z8jp8UloA1Kq2n7R0BRYv9nGLnboIPvc2_mMqpH74yxiTVKx-BwpqB6Si5s0enJDETXcvMmE9nL8wN2UYY6aSnnTneODybUZuisIvlKCo2K7dbl/s1600/RTB+Damage.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGwRei-nKpbq3kkpH-8POKGLE3UhmB2Z8jp8UloA1Kq2n7R0BRYv9nGLnboIPvc2_mMqpH74yxiTVKx-BwpqB6Si5s0enJDETXcvMmE9nL8wN2UYY6aSnnTneODybUZuisIvlKCo2K7dbl/s1600/RTB+Damage.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I also noticed that it seemed to stay in one place and was able to feed by making multiple bites into the thick main leaf vein, I suspect that the major vein might be a bundle of veins and it was tapping into individual sub-veins each time.  This is visible in a subsequent photo.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Protection and Feeding&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Ant Symbiosis with other insects takes a number of forms. A common symbiosis is known as &lt;a href=&quot;https://en.wikipedia.org/wiki/Trophobiosis&quot;&gt;Trophobiosis&lt;/a&gt; where ants feed on what is known as honeydew.  This substance is a mixture of sugars that the insect excretes from its posterior.  It is often the case that the provider of this mixture breaks down more complex polysaccharides into simpler sugars that the ants can digest these include glucose, fructose, etc.   The not so great image below shows this an ant feeding from the posterior of the rhino thorn bug:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JobIWoOU74gquwBKPc85Tp3qIS8kJOwHTyhyNwn3etdQ2gDsVKTdNE8HIJY_XUkBGwHWa1rjZd46BHw1oVC5aSkj3DG5vbhcvUIYDTr6oyQx5k3-gU4WImaLfcmkfwLhYJUK3n0bKBZ_/s1600/ant-troph.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4JobIWoOU74gquwBKPc85Tp3qIS8kJOwHTyhyNwn3etdQ2gDsVKTdNE8HIJY_XUkBGwHWa1rjZd46BHw1oVC5aSkj3DG5vbhcvUIYDTr6oyQx5k3-gU4WImaLfcmkfwLhYJUK3n0bKBZ_/s1600/ant-troph.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This relationship is not unfamiliar to humans. It seems to mirror our use of livestock especially dairy cows, although we get the fluid we consume from a different organ.  However, the behavior of protecting, caring for and in some cases herding these insects is exactly what we do with our livestock.  The ants have been doing this millions of years prior to our existence as the ant &lt;a href=&quot;https://en.wikipedia.org/wiki/Hemiptera&quot;&gt;Hemiptera&lt;/a&gt; symbiosis behavior is thought to have originated in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Eocene&quot;&gt;Eocene&lt;/a&gt; period&lt;!--(p.524)--&gt;.  There is evidence of this, shown below, from about 15 million years ago found in Dominican Amber which shows a queen from the extinct species &lt;a href=&quot;https://en.wikipedia.org/wiki/Acropyga_glaesaria&quot;&gt;Acropyga glaesaria&lt;/a&gt; on her mating flight with a “seed” mealybug in her mandibles for use when she establishes her new colony. &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiygMa3YZb-Ah47UFkRYlANaQr0X7W4xBAbEruClTgTqTLYqwJVHj8XsEaZsSsB3dg2mWibtzlVS5jEKLM-6zqMWtDZsP6YIqlNRR40KiizfBm-zGiaSjivScC_WOXjlNWz8aWQ1G7LgYAX/s1600/Acropyga_glaesaria_SMFBE457B2_01.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiygMa3YZb-Ah47UFkRYlANaQr0X7W4xBAbEruClTgTqTLYqwJVHj8XsEaZsSsB3dg2mWibtzlVS5jEKLM-6zqMWtDZsP6YIqlNRR40KiizfBm-zGiaSjivScC_WOXjlNWz8aWQ1G7LgYAX/s1600/Acropyga_glaesaria_SMFBE457B2_01.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Another ant behavior that I believe I caught is ants transferring food to each other, which is known as &lt;a href=&quot;https://en.wikipedia.org/wiki/Trophallaxis&quot;&gt;Trophallaxis&lt;/a&gt;.  In the image below you can see the two ants at the top with their mandibles interlocked, in a previous picture one of them was feeding and now seems to be transferring food to the other.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXkJZigK5h9SGR8L3GEYg3BF1_sOBkfa-FbRjqlMzNCz5GL9V6Zevs31g4MdxFtCB_ChdYQ1jFbDKNWy70GyXAiVgNBhmp0oV01ZPDjOvP7pnD5DkETckyoAdhVdyDsD2_c0Qu9lLdzS7N/s1600/Trophallaxis.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXkJZigK5h9SGR8L3GEYg3BF1_sOBkfa-FbRjqlMzNCz5GL9V6Zevs31g4MdxFtCB_ChdYQ1jFbDKNWy70GyXAiVgNBhmp0oV01ZPDjOvP7pnD5DkETckyoAdhVdyDsD2_c0Qu9lLdzS7N/s1600/Trophallaxis.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Castes&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Ants have different castes of workers. The image below shows two different castes I observed.  The one at the top is a Major worker.  Ants of this caste are in some cases referred to as soldiers as they in some species take on roles like acting as “doormen” at colony entrances to ensure that only ants of that colony are allowed.  It easy to see that the larger body size with the large head and large mandibles makes them more formidable, although I don’t know if the solder distinction truly applies in this case.  The other two are minor workers which have smaller bodies and heads.  &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJuJ3w23p04KHXg5EeY1g602YMe7_gsu8v4dzfdJZZYt6sXGspR4BiLce_66NdMUdEruPLISu9Po3hNXlVyY-Q0CeAv2H-iZG7We5CTC-1Qf9cUapY6Z_sR19dwYI5I4MPUhqwo-w7wmlt/s1600/Castes.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJuJ3w23p04KHXg5EeY1g602YMe7_gsu8v4dzfdJZZYt6sXGspR4BiLce_66NdMUdEruPLISu9Po3hNXlVyY-Q0CeAv2H-iZG7We5CTC-1Qf9cUapY6Z_sR19dwYI5I4MPUhqwo-w7wmlt/s1600/Castes.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;Rhino Thorn Bugs, the Next Generation&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;As the story unfolded it got even more interesting. I recall, although I don’t have photos of it that the ants seems to escort the thorn bugs to meet each other for mating.  The evidence of mating was soon obvious as can be seen in the photo below with the ants in attendance of the brood of recently hatched nymphs.  The ants tended to the nymphs which included chasing them around as they wandered off. Some of the nymphs seemed to stray and many of them died.  Also visible in this photo are the multiple bites left by what was presumably the female rhino thorn bug made over her extended time staying in one location.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixvCioDNDNvExkl08aIi8rBHAl1NqAcIVYES_KzUNxBG1EGAtZSMBy_nuIfiffPc51LzA4ecnZBQq53jIgDzJ6eM-UxbPdUWFo1QfwpfWCPW1BUjBO_WQg3oeNruY2-1gDhqhyATQWHHht/s1600/Nymphs.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixvCioDNDNvExkl08aIi8rBHAl1NqAcIVYES_KzUNxBG1EGAtZSMBy_nuIfiffPc51LzA4ecnZBQq53jIgDzJ6eM-UxbPdUWFo1QfwpfWCPW1BUjBO_WQg3oeNruY2-1gDhqhyATQWHHht/s1600/Nymphs.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Pretty soon the nymphs are providing the same &lt;a href=&quot;https://en.wikipedia.org/wiki/Trophobiosis&quot;&gt;trophobiosis&lt;/a&gt; as their parents as shown below: &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUou1usNeyDyFy0ajHHYbAS2nCzVN3HwW4syx6gWQg0PXIB-pfHNck-4XJ_TfUjvzpD80EdoX0wv0XVlU_u-lj8dRDdmct0cSssdqTnYKKTI2TGHp4w1iCR5q12kK0aC4HmJolLBAZ5Ycb/s1600/Nymph+troph.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUou1usNeyDyFy0ajHHYbAS2nCzVN3HwW4syx6gWQg0PXIB-pfHNck-4XJ_TfUjvzpD80EdoX0wv0XVlU_u-lj8dRDdmct0cSssdqTnYKKTI2TGHp4w1iCR5q12kK0aC4HmJolLBAZ5Ycb/s1600/Nymph+troph.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;As the nymphs grow up you can see that they start to take on their adult shape: &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyt7SVg64ytu9yn9MKwEKOpj153nl8uLnQj5GVDQmxUpLf1d4gJWpFWWk-GoP3MjbNQeOGyLQYtgCOvyOj4YVGW_7CLQy1tdSq6a7asY2T0Eo42hRl41XzQfd7j5WF6EHl6__1cPmFfcnP/s1600/Older+Nymps.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyt7SVg64ytu9yn9MKwEKOpj153nl8uLnQj5GVDQmxUpLf1d4gJWpFWWk-GoP3MjbNQeOGyLQYtgCOvyOj4YVGW_7CLQy1tdSq6a7asY2T0Eo42hRl41XzQfd7j5WF6EHl6__1cPmFfcnP/s1600/Older+Nymps.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Next Year, New Ants and Aphids&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;I was curious to see if the thorn bugs would return the following year. They did not.  However, I was surprised to a whole new ant drama play out with new actors.   I reached out to the ant biologist who helped me the previous year and he identified these as Tapinoma sessile&lt;a href=&quot;https://en.wikipedia.org/wiki/Tapinoma_sessile&quot;&gt;&lt;/a&gt;.  I was not able to identify the aphids&lt;a href=&quot;http://en.wikipedia.org/wiki/Aphid&quot;&gt;&lt;/a&gt;.  I was told they would be plant specific. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Their activity was concentrated around the flowers and spanned the time that they were in bloom.  The “infestation” of the flower heads can be seen in the following photo:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMrH6akxw4uueg-yIJjHE8uOSzqvSyCYbFjkh8OFcJY1KHWyoWE9o7zAMqpH5dTl82vvUhdZ-jCeTGV1s_RKSE0Eb6F9Mud5-C-19FWVRxTE2I2Fw1vw4ypk3ESSzQN38oFeq8mvMIPAOm/s1600/Flower+Head.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMrH6akxw4uueg-yIJjHE8uOSzqvSyCYbFjkh8OFcJY1KHWyoWE9o7zAMqpH5dTl82vvUhdZ-jCeTGV1s_RKSE0Eb6F9Mud5-C-19FWVRxTE2I2Fw1vw4ypk3ESSzQN38oFeq8mvMIPAOm/s1600/Flower+Head.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Another difference was the ratio of ants to honeydew producers, as you can see there are many aphids to each ant which in contrast to the rhino thorn bugs which often had multiple ants in attendance of each one.  The biologist that I contacted said that the ants looked fat and happy, and their abdomens or gasters in ant biology speak, seem to be bursting and almost glistening, presumably with honeydew.   I once saw &lt;a href=&quot;https://en.wikipedia.org/wiki/David_Attenborough&quot;&gt;David Attenborough&lt;/a&gt; eat a &lt;a href=&quot;https://en.wikipedia.org/wiki/Honeypot_ant&quot;&gt;honeypot ant&lt;/a&gt; and it got me thinking I should have tried it with these guys. Well that was until I learned that their common names include odorous house ant and stink ant.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0GZDSzfSwxo9AtzS9T1JvqEQJsm4nLD6QcQ3FfC4lBbgnKqKU8-2pmp-k98hIgfOGdcIWcpZKplKIiVHxL1e56kl6oAJXEVFJadlA2W49zuTVqUmfdXDpWxIJOsqNFJVXZd269rAmIrMs/s1600/Fat+and+Happy.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0GZDSzfSwxo9AtzS9T1JvqEQJsm4nLD6QcQ3FfC4lBbgnKqKU8-2pmp-k98hIgfOGdcIWcpZKplKIiVHxL1e56kl6oAJXEVFJadlA2W49zuTVqUmfdXDpWxIJOsqNFJVXZd269rAmIrMs/s1600/Fat+and+Happy.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The photo below shows how the flower’s sepal seems to serve as a protected staging area for the aphids to develop to full maturity:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpFG1kxuch4KK83CWFpdG8nHuXSzG8Zo2Z8rUTlsXHdlO0BORZlWxNq_hN8PBkurYOyBI_-SpqPN2H_-k3rUrIg8d-7aBI6ewD1bJZgKAlH1PCey1RYDW2j907l86-HYJYQm4wqSAWNBjs/s1600/Sepal.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpFG1kxuch4KK83CWFpdG8nHuXSzG8Zo2Z8rUTlsXHdlO0BORZlWxNq_hN8PBkurYOyBI_-SpqPN2H_-k3rUrIg8d-7aBI6ewD1bJZgKAlH1PCey1RYDW2j907l86-HYJYQm4wqSAWNBjs/s1600/Sepal.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;All of this happened in 2012. I have not seen the aphids since. I do see the rhino thorn bugs at least one or two each year over the last few years.  I have never seen the level of activity that I saw back in 2011, I am always hopeful that each new year will bring some new drama. Actually last year it was an &lt;a href=&quot;https://en.wikipedia.org/wiki/Opiliones&quot;&gt;opiliones&lt;/a&gt; explosion, but that’s a whole other story.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The story about the Brazil nut symbiosis is interesting and was a little bit of a setup to show my cute seed disperser below.  Although the plant is obscured by another (&lt;a href=&quot;http://www.illinoiswildflowers.info/savanna/plants/wingstem.htm&quot;&gt;Wingstem, Verbesina alternifolia&lt;/a&gt;) It is collecting Large Flower Leafcup seeds, the flower heads are visible slightly right and below it.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEc_EkyFVYbezfVIeTZmueNT0a1qAHx9IHHZFjZ5ksVZxuXDTRNzCkEL-9b1Ukpa9dR-pgPCDG5jEW8BiBEJpQnqMl46WxfvRDLZjhKBr8FhQnBJPgk3TpbuFGaGQIJ7PDQA3ZMSPuOv3Z/s1600/chipmunk.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEc_EkyFVYbezfVIeTZmueNT0a1qAHx9IHHZFjZ5ksVZxuXDTRNzCkEL-9b1Ukpa9dR-pgPCDG5jEW8BiBEJpQnqMl46WxfvRDLZjhKBr8FhQnBJPgk3TpbuFGaGQIJ7PDQA3ZMSPuOv3Z/s1600/chipmunk.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;References and Further Reading&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://whyevolutionistrue.wordpress.com/2010/11/26/the-surreal-treehoppers/&quot;&gt;The surreal treehoppers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wired.com/2014/12/absurd-creature-of-the-week-treehopper/&quot;&gt;Wired: Absurd Creature of the Week: This Is an Actual Insect. This Is Not a Joke&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://treehoppers.insectmuseum.org/public/public_content/show/11953&quot;&gt;Treehoppers:  Aetalionidae, Melizoderidae, and Membracidae (Hemiptera) : Entylia Germar, 1833&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://treehoppers.insectmuseum.org/public/site/treehoppers/home/sounds&quot;&gt;Treehoppers:  Aetalionidae, Melizoderidae, and Membracidae (Hemiptera) :  Sounds of Courtship, Discovery, and Defense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugguide.net/node/view/10205&quot;&gt;Bug Guide: Species : Entylia carinata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugguide.net/node/view/156701&quot;&gt;Bug Guide: Species : Entylia carinata : Treehoppers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugguide.net/node/view/339258&quot;&gt;Bug Guide: Species : Entylia carinata nymphs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://eol.org/pages/3697606/overview&quot;&gt;Encylopedia of Life: Species : Entylia carinata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://photocamel.com/forum/macro-close-up/164763-entylia-carinata-being-tended-ants.html&quot;&gt;&lt;b&gt;Entylia carinata being tended by ants&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://biodiversity.georgetown.edu/index.cfm&quot;&gt;Biodiversity Database of the Washington D.C. Area&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.antweb.org/description.do?rank=species&amp;amp;name=subbarbatus&amp;amp;genus=camponotus&amp;amp;project=illinoisants&quot;&gt;Antweb: Species: Camponotus subbarbatus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.antweb.org/description.do?name=nearcticus&amp;amp;genus=camponotus&amp;amp;rank=species&amp;amp;project=illinoisants&quot;&gt;Species: Camponotus nearcticus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sp11symbiosis.providence.wikispaces.net/Brazil+Nut+Tree+-+Animal+Symbiosis&quot;&gt;Brazil-Nut Tree Symbiosis&#39;s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mutualism.williams.edu/Research/&quot;&gt;Morales Lab : Ant-Publilia Mutualism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Myrmecophily&quot;&gt;Myrmecophily&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Myrmecophyte&quot;&gt;Myrmecophyte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugguide.net/node/view/10205/bgimage&quot;&gt;&lt;b&gt;Species &lt;i&gt;Entylia carinata&lt;/i&gt;&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.marylandbiodiversity.com/viewSpecies.php?species=6252&quot;&gt;&lt;em&gt;&lt;b&gt;Entylia&lt;/b&gt;&lt;/em&gt;&lt;b&gt; &lt;/b&gt;&lt;em&gt;&lt;b&gt;carinata&lt;/b&gt;&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2016/05/my-ant-symbiosis-stories_31.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglJaXpMgP7NaqTcBzMHzz3qgrcfkLlkdkz6XzMei1EI84DzmZWsnnk7H0F9P8pl-uLr2JPgArtEydeUQgHE-8nnqSQilu8gBBgx4u5qRaCyIqkhfeWF2gg0dLupeArfi5ZLJDAemE7p_Qi/s72-c/Top+Photo.JPG" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-7874146516240998762</guid><pubDate>Thu, 30 Apr 2015 12:46:00 +0000</pubDate><atom:updated>2015-04-30T08:46:35.045-04:00</atom:updated><title>What is Software Engineering?</title><description>&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

blockquote.paraphrase {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}
&lt;/style&gt;&lt;!--What is Software Engineering?--&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqBmpA7VMoVrzmNyU5AZwYmfgM9MudHO2fHcnpvbrePsfdwo833JZssoeFSv6pnTYnkspTmEckowyjLfKA9w0Bzkeg4xDFdvaNVfyAh9imXgRLdJYCix52XIiEqY-tGObpryQFU_DlSiO5/s1600/Huygens_approaches_Titan.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqBmpA7VMoVrzmNyU5AZwYmfgM9MudHO2fHcnpvbrePsfdwo833JZssoeFSv6pnTYnkspTmEckowyjLfKA9w0Bzkeg4xDFdvaNVfyAh9imXgRLdJYCix52XIiEqY-tGObpryQFU_DlSiO5/s400/Huygens_approaches_Titan.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;The terms &lt;b&gt;software engineering&lt;/b&gt;, &lt;b&gt;software engineer&lt;/b&gt;, and sometimes just &lt;b&gt;engineer&lt;/b&gt; as in &quot;full stack engineer&quot; appear a lot in the software development field.  Some people including myself find the use of the term &quot;Software Engineering&quot; to be somewhat dubious. I also feel that there are too many people calling themselves engineers who really shouldn’t be.  As a result of my skepticism I have been trying to devise a way to determine exactly what is Software Engineering?&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The happy path is to go to the web and search for it or just find a book. Both will lead to many answers.  But that is really just getting someone else’s opinion.  A little later we will look at other people’s opinions as there are very established authors who readily answer this question.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;To get some perspective, let’s step back and ask a more basic question. What is engineering?  For this I will rely on the ultimate oracle of our time. Some top responses from the Google are:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The Google dictionary definition:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;en&amp;middot;gi&amp;middot;neer&amp;middot;ing&lt;/p&gt;&lt;p&gt;noun&lt;/p&gt;&lt;p&gt;the branch of science and technology concerned with the design, building, and use of engines, machines, and structures.&lt;/p&gt;&lt;p&gt;&amp;bull; the work done by, or the occupation of, an engineer.&lt;/p&gt;&lt;p&gt;&amp;bull; the action of working artfully to bring something about.&lt;/p&gt;&lt;p&gt;&amp;quot;if not for Keegan&#39;s shrewd engineering, the election would have been lost&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;The Georgia Tech School of Engineering provides the &lt;a href=&quot;http://www.ece.gatech.edu/academics/outreach/engineering.html&quot;&gt;following&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Engineering is the practical application of science and math to solve problems, and it is everywhere in the world around you. From the start to the end of each day, engineering technologies improve the ways that we communicate, work, travel, stay healthy, and entertain ourselves.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://www.livescience.com/47499-what-is-engineering.html&quot;&gt;What is Engineering? | Types of Engineering&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Engineering is the application of science and math to solve problems.  Engineers figure out how things work and find practical uses for scientific discoveries.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Engineering&quot;&gt;Wikipedia:&lt;/a&gt; defines it as&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Engineering (from &lt;a href=&quot;http://en.wikipedia.org/wiki/Latin&quot; title=Latin&gt;Latin&lt;/a&gt; ingenium, meaning &amp;quot;cleverness&amp;quot; and ingeniare, meaning &amp;quot;to contrive, devise&amp;quot;) is the application of &lt;a href=&quot;http://en.wikipedia.org/wiki/Science&quot; title=Science&gt;scientific&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Economics&quot; title=Economics&gt;economic&lt;/a&gt;, social, and practical knowledge in order to &lt;a href=&quot;http://en.wikipedia.org/wiki/Invention&quot; title=Invention&gt;invent&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Design&quot; title=Design&gt;design&lt;/a&gt;, build, maintain, research, and improve structures, machines, devices, systems, materials and &lt;a href=&quot;http://en.wikipedia.org/wiki/Process_(engineering)&quot; title=&quot;Process (engineering)&quot;&gt;processes&lt;/a&gt;.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;So to summarize and synthesize the above for a working definition, we get:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;paraphrase&quot;&gt;Engineering is a branch of science and technology where mathematical, scientific, economic, and social knowledge are applied artfully, creatively, and efficiently to invent, design, build, maintain, research, and improve structures, machines, devices, systems, materials and processes.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Another aspect of engineering that should be considered is its diversity. Just searching around I came up with the following list of types of engineering, which should by no means be considered complete, they include:  Aeronautical, Agricultural, Audio, Biomedical, Biomechanical, Building, Ceramics, Chemical, Civil, Computer, Electrical, Electronics, Environmental, Food, Geological, Industrial, Marine, Mechanical, Military, Mineral, Military, Nuclear, Optical, Petroleum, Photonics, Systems, and Textile.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Often discussions of software engineering draw parallels to construction and civil engineering and it is easy to see why, most people often see the results of these disciplines and even live in them.  Not to trivialize these disciplines, but bricks and mortar, in addition to wood, glass, and rebar are things that support our lives and are physical thus somewhat easy to conceptualize.  But all engineering disciplines now touch and perhaps run our lives in ways that we rarely think about.  I &lt;a href=&quot;http://www.elegantcoding.com/2011/12/metaphorically-thinking-about-software.html&quot;&gt;previously posited&lt;/a&gt; that chemical engineering, prior to the software era, was probably the most pervasive engineering in our lives not to mention that the computer hardware we use wouldn’t exist without it.  It serves as an interesting area to look at in regards to software engineering comparisons too, as it is a relatively recent discipline and has some parallels like the control of processes and &quot;flows&quot; in this case of materials.  Perhaps the closest &quot;relative&quot; to software engineering might be industrial engineering.  Like software it deals with human factors.  It also deals with stochastic processes, something that is becoming increasingly more important in software systems. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Now that we have some general engineering perspective, let’s revisit the question &quot;What is software engineering&quot; by looking at what the established organizations and authors have to say. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wikipedia gives the following &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_engineering&quot;&gt;definition&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Software engineering is the study and an application of &lt;a href=&quot;http://en.wikipedia.org/wiki/Engineering&quot; title=Engineering&gt;engineering&lt;/a&gt; to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_design&quot; title=&quot;Software design&quot;&gt;design&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_development&quot; title=&quot;Software development&quot;&gt;development&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_maintenance&quot; title=&quot;Software maintenance&quot;&gt;maintenance&lt;/a&gt; of &lt;a href=&quot;http://en.wikipedia.org/wiki/Software&quot; title=Software&gt;software&lt;/a&gt;.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Typical formal definitions of software engineering are:&lt;/p&gt;&lt;br /&gt;
&lt;ul type=disc&gt;&lt;li&gt;the application of a systematic, disciplined, quantifiable approach to the      development, operation, and maintenance of &lt;a      href=&quot;http://en.wikipedia.org/wiki/Software&quot; title=Software&gt;software&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;an engineering discipline that is concerned with all aspects of software      production&lt;/li&gt;
&lt;li&gt;the establishment and use of sound engineering principles in order to      economically obtain software that is reliable and works efficiently on      real machines.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;K.K. Aggarwal provides us with a bit of &lt;a href=&quot;http://www.niecdelhi.ac.in/uploads/Notes/btech/4sem/cse/21378403-Software-Engineering-By-K-K-Aggarwal-YogeshSingh-Full-Notes.pdf&quot;&gt;history&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;At the first conference on software engineering in 1968, Fritz Bauer defined software engineering as &quot;The establishment and use of sound engineering principles in order to obtain economically developed software that is reliable and works efficiently on real machines&quot;.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Stephen Schach defined the same as &quot;A discipline whose aim is the production of quality software, software that is delivered on time, within budget, and that satisfies its requirements&quot;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The &lt;a href=&quot;http://computingcareers.acm.org/?page_id=12&quot;&gt;ACM&lt;/a&gt; weighs in with:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Software engineering (SE) is concerned with developing and maintaining software systems that behave reliably and efficiently, are affordable to develop and maintain, and satisfy all the requirements that customers have defined for them. It is important because of the impact of large, expensive software systems and the role of software in safety-critical applications. It integrates significant mathematics, computer science and practices whose origins are in engineering.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;There are a number of books on software engineering which have an obligation to address the question.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The answer in Ian Sommerville’s 8th Edition of &lt;u&gt;Software Engineering&lt;/u&gt;  is:&lt;/p&gt;&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;Software engineering is an engineering discipline that is concerned with all aspects of software production from the early stages of system specification to maintaining the system after it has gone into use. In this definition, there are two key phrases:&lt;/p&gt;&lt;p&gt;1. Engineering discipline Engineers make things work. They apply theories, methods and tools where these are appropriate,. but they use them selectively and always try to discover solutions to problems even when there are no applicable theories and methods. Engineers also recognise that they must work to organisational and financial constraints, so they look for solutions within these constraints.&lt;/p&gt;&lt;p&gt;2. All aspects of software production Software engineering is not just concerned with the technical processes of software development but also with activities such as software project management and with the development of tools, methods and theories to support software production.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;&lt;u&gt;What Every Engineer Should Know about Software Engineering &lt;/u&gt;by Philip A. Laplante offers the following:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;Software engineering is &quot;a systematic approach to the analysis, design, assessment, implementation, test, maintenance, and reengineering of software, that is, the application of engineering to software. In the software engineering approach, several models for the software life cycle are defined, and many methodologies for the definition and assessment of the different phases of a life-cycle model&quot; [Laplante 2001]&lt;/p&gt;&lt;p&gt;In &lt;u&gt;Software Engineering A Practitioner&#39;s Approach 8th Edition&lt;/u&gt; Roger S. Pressman and Bruce R. Maxim provide a terse explanation:&lt;/p&gt;&lt;p&gt;Software Engineering encompasses a process, a collection of methods [practice] and an array of tools that allow professionals to build high-quality computer software.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Roger Y. Lee describes it in &lt;u&gt;Software Engineering:A Hands-On Approach&lt;/u&gt; as:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Software engineering is the process of designing, developing and delivering software systems that meet a client’s requirements in an efficient and cost effective manner. To achieve this end, software engineers focus not only on the writing of a program, but on every aspect of the process, from clear initial communication with the client, through effective project management, to economical post-delivery maintenance practices. The IEEE Standard glossary of software engineering terminology defines software engineering as the application of a systematic, disciplined, quantifiable approach to the development, operation and maintenance of software (Ghezzi et al. 1991). As made clear by the above definition, software engineering came about in order to reverse early development practices by establishing a standard development method that could unify and normalize development operations, regardless of the people involved or the goals sought.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;The laborious effort of wading through all of this erudition gives me the following distillation: &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Software Engineering is:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;An engineering discipline&lt;/li&gt;
&lt;li&gt;Application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of &lt;a href=&quot;http://en.wikipedia.org/wiki/Software&quot; title=Software&gt;software&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;Software engineering (SE) is concerned with developing and maintaining software&lt;/li&gt;
&lt;li&gt;Software engineering is the process of designing, developing and delivering software systems&lt;/li&gt;
&lt;li&gt;A standard development method that can unify and normalize development operations, regardless of the people involved or the goals sought.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;Software Engineering Includes:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;All aspects of software production from the early stages of system specification to maintaining&lt;/li&gt;
&lt;li&gt;The system after it has gone into use&lt;/li&gt;
&lt;li&gt;Non technical activities such as software project management and with the development of tools, methods and theories to support software production.&lt;/li&gt;
&lt;li&gt;The integration of significant mathematics, computer science and practices whose origins are in engineering.&lt;/li&gt;
&lt;li&gt;The application of theories, methods and tools where these are appropriate&lt;/li&gt;
&lt;li&gt;Many methodologies for the definition and assessment of the different phases of a life-cycle model&lt;/li&gt;
&lt;li&gt;Several models for the software life cycle&lt;/li&gt;
&lt;li&gt;A process, a collection of methods [practice] and an array of tools that allow professionals to build high-quality computer software.&lt;/li&gt;
&lt;li&gt;The application of sound &lt;a href=&quot;http://en.wikipedia.org/wiki/Engineering&quot; title=Engineering&gt;engineering&lt;/a&gt; principles to the analysis, &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_design&quot; title=&quot;Software design&quot;&gt;design&lt;/a&gt;, implementation (&lt;a href=&quot;http://en.wikipedia.org/wiki/Software_development&quot; title=&quot;Software development&quot;&gt;development&lt;/a&gt;), assessment, test, &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_maintenance&quot; title=&quot;Software maintenance&quot;&gt;maintenance&lt;/a&gt; and reengineering of &lt;a href=&quot;http://en.wikipedia.org/wiki/Software&quot; title=Software&gt;software&lt;/a&gt; that is reliable and works efficiently on real machines&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;Software Engineering Produces:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Quality software&lt;/li&gt;
&lt;li&gt;Software that is delivered on time&lt;/li&gt;
&lt;li&gt;Cost effective production of software (within budget)&lt;/li&gt;
&lt;li&gt;Software that satisfies its requirements.&lt;/li&gt;
&lt;li&gt;Software systems that behave reliably and efficiently&lt;/li&gt;
&lt;li&gt;Software that is affordable to develop and maintain&lt;/li&gt;
&lt;li&gt;Solutions that conform to organizational and financial constraints&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;I tried to break the multitude of ideas into three categories, but they are admittedly a bit fuzzy and you could probably move some of these around.  The point of the categorization exercise is to attempt to separate a definition from the broader idea of what the discipline encompasses and the attributes of the structures and systems that it produces, again things can get fuzzy here.  In thinking about these and my own experience with software development I came up with a list of things that I feel should be defined to make software engineering a real discipline and they are: &lt;/p&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;What is the definition of the engineering discipline we are describing?&lt;/li&gt;
&lt;li&gt;What are the produced artifacts, e.g. structures and processes that the discipline creates?&lt;/li&gt;
&lt;li&gt;What non-managerial processes and methodologies are used to create the produced artifacts?&lt;/li&gt;
&lt;li&gt;What types of documentation (descriptive artifacts) are used to describe the produced artifacts and the processes to create those produced artifacts? &lt;/li&gt;
&lt;li&gt;How does the underlying math and science support the engineering discipline and how do these foundational disciplines allow one to reason about the produced artifacts that the engineering discipline is trying to construct?  How do these disciplines define and drive the descriptive artifacts?&lt;/li&gt;
&lt;li&gt;How does one organize and manage the effort including various roles people will play to actually carry out the work to bring the system or structure to fruition?&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;p&gt;So coming back to the original purpose of this post, my answer to the question of what is software engineering, number one above, is:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;paraphrase&quot;&gt;Software engineering is the branch of science and technology where mathematical, computer science, linguistic, social knowledge and system relevant domain specific knowledge are applied artfully, creatively, and efficiently to invent, design, build, maintain, research, and improve software systems.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;That’s the easy part. The hard part is what are the answers to the other five questions? I know that there a number of industry standard answers for these that include things like UML, Agile, Scrum, etc., but are those really valid and are they really working? I don’t think so, so maybe it’s time to look for other answers. &lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://www.elegantcoding.com/2015/04/what-is-software-engineering.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqBmpA7VMoVrzmNyU5AZwYmfgM9MudHO2fHcnpvbrePsfdwo833JZssoeFSv6pnTYnkspTmEckowyjLfKA9w0Bzkeg4xDFdvaNVfyAh9imXgRLdJYCix52XIiEqY-tGObpryQFU_DlSiO5/s72-c/Huygens_approaches_Titan.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-2119030034046994416</guid><pubDate>Mon, 23 Mar 2015 11:45:00 +0000</pubDate><atom:updated>2015-03-23T07:45:42.031-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Software Development</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><title>What is Software Correctness?</title><description>&lt;div&gt;&lt;!--What is Software Correctness?--&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHsBF781-SfVtWoOoqL5pewKCCad3Hytt7nh-UBR131MAk485pOWAa9GGbnL2XHbO6qpMTdzbrjXZtH4YcCDO0eOzs8qSmjdczc6iRfSBkPvS29-6WpPHUJvwdeqIMDORy3fXGPxvfbj9Z/s1600/Curiosity.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHsBF781-SfVtWoOoqL5pewKCCad3Hytt7nh-UBR131MAk485pOWAa9GGbnL2XHbO6qpMTdzbrjXZtH4YcCDO0eOzs8qSmjdczc6iRfSBkPvS29-6WpPHUJvwdeqIMDORy3fXGPxvfbj9Z/s400/Curiosity.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Software correctness which is really software quality is not one thing.  It is comprised of a number of different and sometimes conflicting attributes.  As always &lt;a href=&quot;http://groups.csail.mit.edu/mac/users/gjs/gjs.html&quot;&gt;Gerald J. Sussman&lt;/a&gt; provides interesting insights and in this case it is in his &quot;&lt;a href=&quot;http://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Compute&quot;&gt;We really don’t know how to compute&lt;/a&gt;&quot; talk.   He makes the point that &quot;correctness&quot; may not be the most important attribute of software, the example he give is if Google’s page craps out on you, you will probably try again and it will probably work.  Actually this example might be more about reliability but it got me thinking as I have always thought that &quot;software correctness&quot; meant the combination of both accuracy and reliability and that was this the &quot;correctness&quot; that I always thought was the most important feature of software.  But this correctness is really two software quality attributes and the Google search software exemplifies these two aspects of &quot;software correctness&quot;, one is availability and the other is search accuracy or the fulfillment of the users expectations.  One could argue that availability is not a software attribute but it is affected by the quality of the software and it is an attribute of a software system even if some of that might be driven by hardware.   So these two attributes for Google search do not have to be perfect.  The search quality needs to be at least better than the competition and the availability has to be high enough so that people won’t be discouraged from using it and for these two attributes they are both very high.   These parameters of quality vary in other domains, a machine administering a dose of radiation to a cancer patient would need to have stringent requirements as to the correctness of the dose, and in fact there have been deaths due to exactly this type of problem.  Another is software guiding a spacecraft or a Mars rover which needs to be extremely reliable and correct and when it hasn’t been, well there are a few space bricks floating around the solar system due to software errors.  In the real world, especially now, software is everywhere and it now lives in a variety of contexts.  So which quality attributes are important will vary based on its domain and its context.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So what makes software good?  Google first conquered search with Map-Reduce and other processes running on custom commodity hardware that allowed for flexible fault tolerant distributed massive data crunching.  Amazon has commoditized its server infrastructure to sell spare capacity that can be easily used by anyone.  Apple created easy to use attractive interfaces for the iPhone and iPad that consumers loved with similar usability now being offered on Android.  NASA has successfully landed on the frigid world of Titan, touched the edge of the heliosphere, and has run rovers on Mars.  While there are obviously hardware components to these systems, it was the various types of software quality that played a pivotal role in these and the many other great software successes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;It is easy to look back at these successes.  With the exception of NASA, I doubt there was a deliberate effort on which quality aspects to focus on.  Most were probably chosen intuitively based on business needs.  Software quality is essential to any organization that creates software.  It is an established subdomain or perhaps a related separate sibling field of software development.  It has &lt;a href=&quot;http://en.wikipedia.org/wiki/CISQ&quot;&gt;consortiums&lt;/a&gt;, &lt;a href=&quot;http://www.sqe.com/AboutUs.aspx&quot;&gt;professional organizations&lt;/a&gt; and many books written on the subject.  So I delved into some of these and you find mention of Agile and TDD.  You also start to see things like &lt;a href=&quot;http://en.wikipedia.org/wiki/Capability_Maturity_Model_Integration&quot;&gt;CMMI&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/ISO_9000&quot;&gt;ISO 9000&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Six_Sigma&quot;&gt;Six Sigma&lt;/a&gt;.  Some of the resources seem to be written in some alien language, perhaps called ISO900ese, that seems related to software development but leaves me feeling very disconnected from it.   I think that the problem might be that these attempts to formalize software quality as a discipline are suffering from the same problem that plagues the attempt to formalize software engineering as a discipline.  It conflates the development process with the final product and the software quality formalization might be further exacerbated by the influence of the domain of manufacturing and its jargon.  I think these established methodologies have value, &lt;a href=&quot;http://en.wikipedia.org/wiki/ISO/IEC_9126&quot;&gt;for example&lt;/a&gt; makes sense, but it seems like in general with these standards there is a lot to weed through and the good parts seem to be hard to pick out.  So I thought it might be fruitful to look at the problem from another angle that might provide a better way to reason about the quality of a system not only after and during its development but also before development begins.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A list of &quot;quality parameters&quot; for software is a requirement for software engineering to be a real engineering discipline.  These parameters could then be viewed qualitatively and quantitatively and perhaps even be measured.  In engineering disciplines various parameters are tradeoffs, you can make something sturdier but you will probably raise the cost and or the weight, for example plastic bumpers on cars, metal would be more durable but would be heavier and more costly.  If one were to think of some parameters in software as tradeoffs you can see that improvements on some parameters may cause others to go down.  In my post &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/02/software-reuse-complexity-curve.html&quot;&gt;The Software Reuse Complexity Curve&lt;/a&gt;&quot; I posit that reuse and complexity are interrelated and that the level of reuse can affect understandability and maintainability.  Another example is performance, increasing performance of certain modules or functions might lead to an increase in complexity which without proper documentation could lead to harder understandability which might cause a higher long term maintenance cost.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So to come back to the question and to rephrase it:  What are the attributes that constitute software quality?   I am not the only person to ask this question as I have seen other blog posts that address this. There are quite a few people who have asked this question and have compiled good lists.  &lt;a href=&quot;http://www.catonmat.net/blog/mit-introduction-to-algorithms-part-one&quot;&gt;One post&lt;/a&gt; by Peteris Krumins lists out some code quality attributes that &lt;a href=&quot;http://people.csail.mit.edu/cel/&quot;&gt;Charles E. Leiserson&lt;/a&gt;, in his first lecture of MIT&#39;s Introduction to Algorithms, mentions  as being more important than performance.   Additionally &lt;a href=&quot;http://bryansoliman.wordpress.com/&quot;&gt;&lt;/a&gt;Bryan Soliman&lt;/a&gt;’s post &quot;&lt;a href=&quot;http://bryansoliman.wordpress.com/2011/04/14/40/&quot;&gt;Software Engineering Quality Aspects&lt;/a&gt;&quot; provides a nice list with a number of references.  I thought I’d create my own list derived from those sources and my own experience.  I am categorizing mine in three groups, Requirements based (including nonfunctional requirements), structural, and items that fall into both categories. &lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;REQUIREMENTS&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Correctness (Requirements Conformance)&lt;/li&gt;
&lt;li&gt;User Expectations&lt;/li&gt;
&lt;li&gt;Functionality&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Availability&lt;/li&gt;
&lt;li&gt;Financial Cost&lt;/li&gt;
&lt;li&gt;Auditability&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;STRUCTURAL&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Modularity&lt;/li&gt;
&lt;li&gt;Component Replaceability&lt;/li&gt;
&lt;li&gt;Recoverability&lt;/li&gt;
&lt;li&gt;Good Descriptive Consistent Naming&lt;/li&gt;
&lt;li&gt;Maintainability/ Changeability&lt;/li&gt;
&lt;li&gt;Programmer&#39;s time&lt;/li&gt;
&lt;li&gt;Extensibility/Modifiability&lt;/li&gt;
&lt;li&gt;Reusability&lt;/li&gt;
&lt;li&gt;Testability&lt;/li&gt;
&lt;li&gt;Industry standard best practices (idiomatic code) &lt;/li&gt;
&lt;li&gt;Effective library use, leveraging open source (minimal reinvention)&lt;/li&gt;
&lt;li&gt;Proper Abstractions and Clear code flow&lt;/li&gt;
&lt;li&gt;Good and easy to follow architecture/ Conceptual Integrity&lt;/li&gt;
&lt;li&gt;Has no security vulnerabilities&lt;/li&gt;
&lt;li&gt;Short low complexity routines&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;BOTH&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Robustness/Recoverability&lt;/li&gt;
&lt;li&gt;Usability&lt;/li&gt;
&lt;li&gt;Adaptability&lt;/li&gt;
&lt;li&gt;Efficiency&lt;/li&gt;
&lt;li&gt;Interoperability/Integrate-ability&lt;/li&gt;
&lt;li&gt;Standards&lt;/li&gt;
&lt;li&gt;Durability&lt;/li&gt;
&lt;li&gt;Complexity&lt;/li&gt;
&lt;li&gt;Installability&lt;/li&gt;
&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;This is by no means intended as a definitive list.  The idea here is to put forth the idea of enumerating and classifying these attributes as a way to reason about, plan and remediate the quality of software projects, basically create a methodical way to address software quality throughout the software development lifecycle.  In the case of planning software quality attributes can be potentially rated with respect to priority.  This could also allow conflicting attributes to be more effectively evaluated.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The attribute of availability is one that is fairly easy to quantify and often gets addressed usually in some type of Service Level Aggreement (SLA).  Although availability cannot be predicted, the underlying system that &quot;provides&quot; it can be tested. Netflix has developed &lt;a href=&quot;http://techblog.netflix.com/2012/07/chaos-monkey-released-into-wild.html&quot;&gt;chaos monkey&lt;/a&gt; to in part to verify (test) this quality attribute of their production system.  Tests and QA testers are a way to verify the requirements correctness and the correctness of system level components and services contracts of software. Static analysis tools like PMD, Checkstyle, and Sonarqube can help with code complexity, code conventions and even naming.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Complexity is an elusive idea in this context it also crosses many of the above ideas.  Code can be overly complex, as can UIs, Usability (think command line), Installability, etc.  Another cross concept is understandability which can affect code, UIs, etc. which is in part related to complexity but can manifest itself in the use of bad or unconventional nomenclature as well.  There may be other cross concerns and it seems that the spectrum of quality attributes might better reasoned about by separating out these concepts and developing general ways to reason about them.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I should note that I include financial cost as one of the attributes.  While it might not be a real quality attribute, higher quality may necessitate higher cost, but not necessarily.  If one were to develop two systems that had the same level of quality across all of the chosen attributes, but one system had twice the cost, the cheaper one would be a better value, hence more desirable. So cost is not a quality attribute per se, but it is always an important factor in software development.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In summary my vision is a comprehensive methodology where the quality attributes of a software system are defined and prioritized and hopefully measured.  They are planned for and tracked throughout the life cycle and perhaps adjusted as new needs arise or are discovered.  The existing tools would be used in a deliberate manner and perhaps as thinking about the quality attributes becomes more formalized new tools will be developed to cover areas that are not currently covered.  It will no longer be about code coverage but quality coverage.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;References and Further Reading&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Anthony Ferrara, Beyond Clean Code,  &lt;a href=&quot;http://blog.ircmaxell.com/2013/11/beyond-clean-code.html&quot;&gt;http://blog.ircmaxell.com/2013/11/beyond-clean-code.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;David Chappell,  The Three Aspects of Software Quality: Functional, Structural, and Process, &lt;a href=&quot;http://www.davidchappell.com/writing/white_papers/The_Three_Aspects_of_Software_Quality_v1.0-Chappell.pdf&quot;&gt;http://www.davidchappell.com/writing/white_papers/The_Three_Aspects_of_Software_Quality_v1.0-Chappell.pdf&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Rikard Edgren, Henrik Emilsson and Martin Jansson , Software Quality Characteristics, &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://thetesteye.com/posters/TheTestEye_SoftwareQualityCharacteristics.pdf&quot;&gt;http://thetesteye.com/posters/TheTestEye_SoftwareQualityCharacteristics.pdf&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Bryan Soliman, Software Engineering QualityAspects, &lt;a href=&quot;http://bryansoliman.wordpress.com/2011/04/14/40/&quot;&gt;http://bryansoliman.wordpress.com/2011/04/14/40/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ben Moseley and Peter Marks , Out of the Tar Pit, &lt;a href=&quot;http://shaffner.us/cs/papers/tarpit.pdf&quot;&gt;http://shaffner.us/cs/papers/tarpit.pdf&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Brian Foote and Joseph Yoder, Big Ball of Mud, &lt;a href=&quot;http://laputan.org/mud/&quot;&gt;http://laputan.org/mud/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Wikipedia , Software quality, &lt;a href=&quot;http://en.wikipedia.org/wiki/Software_quality&quot;&gt;http://en.wikipedia.org/wiki/Software_quality&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Franco Martinig, Software Quality Attributes, &lt;a href=&quot;http://blog.martinig.ch/quotes/software-quality-attributes/&quot;&gt;http://blog.martinig.ch/quotes/software-quality-attributes/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;MSDN, Chapter 16: Quality Attributes, &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ee658094.aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/ee658094.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Advoss, Software Quality Attributes, &lt;a href=&quot;http://www.advoss.com/software-quality-attributes.html&quot;&gt;http://www.advoss.com/software-quality-attributes.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Eric Jacobson, CRUSSPIC STMPL Reborn, &lt;a href=&quot;http://www.testthisblog.com/2011/08/crusspic-stmpl-reborn.html&quot;&gt;http://www.testthisblog.com/2011/08/crusspic-stmpl-reborn.html&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://www.elegantcoding.com/2015/03/what-is-software-correctness.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHsBF781-SfVtWoOoqL5pewKCCad3Hytt7nh-UBR131MAk485pOWAa9GGbnL2XHbO6qpMTdzbrjXZtH4YcCDO0eOzs8qSmjdczc6iRfSBkPvS29-6WpPHUJvwdeqIMDORy3fXGPxvfbj9Z/s72-c/Curiosity.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-2637110851840015648</guid><pubDate>Thu, 14 Aug 2014 11:01:00 +0000</pubDate><atom:updated>2017-02-06T12:11:03.245-05:00</atom:updated><title>A Brief and Incomplete History of Computing from Ancient to Modern</title><description>&lt;!-- div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ1cAUGYPeOF0u_XLd66L3Z73jxY-TRYOjUhmlUdEYCsiKsMjSOCclBMDfPrnpi7B-F7t4KwwlSlm3liqI7NZjs5II296pQb_y8gSFX-LIx-Yyhea1BTIq5hR7iXhfk-fD_wjqkV74rMCn/s1600/cloud-comp.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ1cAUGYPeOF0u_XLd66L3Z73jxY-TRYOjUhmlUdEYCsiKsMjSOCclBMDfPrnpi7B-F7t4KwwlSlm3liqI7NZjs5II296pQb_y8gSFX-LIx-Yyhea1BTIq5hR7iXhfk-fD_wjqkV74rMCn/s400/cloud-comp.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;A Brief and Incomplete History of Computing from Ancient to Modern --&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSTZPFJexb6an6JOMwOUd9a5qRvaTvJtOvIy4HnQOyyVrDu_RrNmZDzIlHL74QAh3-lSJdlCVsXEuQzMryjgk6nIufg1j-9tPmfGIbDckQ0X-ejAZkdmjEuP9_ZPf03ynHFrD5ZimsLbDY/s1600/woz.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSTZPFJexb6an6JOMwOUd9a5qRvaTvJtOvIy4HnQOyyVrDu_RrNmZDzIlHL74QAh3-lSJdlCVsXEuQzMryjgk6nIufg1j-9tPmfGIbDckQ0X-ejAZkdmjEuP9_ZPf03ynHFrD5ZimsLbDY/s400/woz.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;I recently attended an event here in DC where &lt;a href=&quot;http://en.wikipedia.org/wiki/Steve_Wozniak&quot;&gt;Woz&lt;/a&gt; was the guest of honor.  I was unaware of his book at the time.  So leading up to it, I thought it would be fun to re-watch a couple of old documentaries in which he appears.  I forewent his foray into reality TV.  I chose to watch &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/The_Machine_That_Changed_the_World_%28miniseries%29&quot;&gt;The Machine that Changed the World&lt;/a&gt;&quot; &lt;a href=&quot;http://www.youtube.com/watch?v=kYFRdV1r4nU&quot;&gt;(youtube)&lt;/a&gt;  a PBS documentary  from 1992 which is farsighted enough to not feel completely dated plus the chronicling of the early history of computing is nicely  done.   The other was Robert X Cringley’s  1996 &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Triumph_of_the_Nerds&quot;&gt;Triumph of the Nerds&lt;/a&gt;&quot; &lt;a href=&quot;http://www.youtube.com/watch?v=HuBXbvl1Sg4&quot;&gt;(youtube)&lt;/a&gt; which is a fun account of the rise of the personal computer.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivJPLEy1DZn9Xzu4DJG7MZ-i6i-QQ6wwxySBqdKAVR1MNraSHsDXQ4hqE6b-W0oH5FFz-NFYtitzEQtPtgIH2NwTfbsA3QaumJxkKU2jJiiNCKZHwjT8ixGxWLoyOPtaUIusvrHSCBw3Mg/s1600/Eniac.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivJPLEy1DZn9Xzu4DJG7MZ-i6i-QQ6wwxySBqdKAVR1MNraSHsDXQ4hqE6b-W0oH5FFz-NFYtitzEQtPtgIH2NwTfbsA3QaumJxkKU2jJiiNCKZHwjT8ixGxWLoyOPtaUIusvrHSCBw3Mg/s320/Eniac.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;clear: both; text-align: center;&quot;&gt;ENAIC took up 1800 square feet &lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Watching these rekindled an idea I had to do a history of events from ancient to modern that got us to where we are now.  So I set forth to collect and list notable events that propelled both the science and industry of computing to its present state.  My goal was to include the people and events that not only shaped the technology but that also shaped the industry and the language we use to describe things.  One example is the term bug that many people may take for granted.  It is derived from a problem caused by an actual insect, a moth stuck in a relay.  The other and perhaps more profound case is that the word &quot;computer&quot;, a name we also take for granted, was a historical accident.  Prior to 1940 a computer was a &lt;a href=&quot;http://en.wikipedia.org/wiki/Human_computer&quot;&gt;person&lt;/a&gt; who did computations or calculations.  Many of the first machines with the exception of the decryption work done &lt;a href=&quot;http://en.wikipedia.org/wiki/Bletchley_Park&quot;&gt;Bletchley Park&lt;/a&gt; were developed for doing computations, specifically &lt;a href=&quot;http://en.wikipedia.org/wiki/ENIAC&quot;&gt;ENIAC&lt;/a&gt;, which was initially designed to calculate artillery firing tables.  ENIAC became the first well known computer and captured the public’s imagination when the &quot;Giant Brain&quot; was displayed to the American press in 1946.  Not long after that the word computer went from describing a person to a machine.  Meanwhile the &lt;a href=&quot;http://en.wikipedia.org/wiki/Colossus_computer&quot;&gt;Colossus machine&lt;/a&gt; from Bletchley Park, the project Alan Turing worked on, remained a secret until the 1970’s.  Had that work been made public immediately following the war we might be calling these machines decoders or decrypters and the history of the computer might have taken some different turns, who knows maybe even Silicon on Avon, okay that’s probably a stretch.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As I was chronicling these events of which I tried to include when certain ideas and inventions occurred I noticed some interesting trends.  For example some ideas like the algorithm and robotics (or mechanical automata) are quite ancient going back over a thousand years.  Many of the technologies we use today date back mostly about 30 to 50 years ago and some are even older.  Magnetic storage was patented in 1878, making it 19&lt;sup&gt;th&lt;/sup&gt; century technology, and if you think about it, it is really is fairly primitive, I‘ve heard hard disks described as &quot;spinning rust&quot;.  Admittedly today’s hard disks contain very sophisticated electronics and electromechanics but are still technologically primitive (effectively sophisticated 19&lt;sup&gt;th&lt;/sup&gt; century technology) compared to SSD technology, which is 20&lt;sup&gt;th&lt;/sup&gt; century technology with DRAM from 1966 and NAND Flash being invented in 1980.  The real advances, not surprisingly, are the advances in materials science, fabrication and manufacturing that take 1970’s technological developments like the active matrix display technology and make them small, cheap and ubiquitous today.   &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;There are many interesting people who played very important and pivotal roles who seem to be largely forgotten.  One of my biggest pet peeves is the cult of personality effect that seems to show up in our industry and the worst case of it is probably Steve Jobs.  I remember working with one young fanboy who was telling me how great Steve Jobs was and that Steve Jobs thought of the iPad in the 1970s, to which I replied that it was depicted in a movie called 2001 from the late 1960s, which I would wager that Jobs had seen. I include that movie in my list of events because it does depict advanced computer technology.  While Steve Jobs seems to garner more attention than he deserves, and I do credit Apple with certain events that shaped the industry as it is today.  I think there are several more interesting people who have made much more substantial contributions. One person is Robert Noyce who cofounded Intel and invented the practical version of the integrated circuit that we use today, he was kind of a Jobs and Wozniak combo in terms of technical brilliance and business acumen.   Another interesting story surrounds ARPANET, the proto-internet.  While Al Gore may have tried to take credit for its invention, J. C. R. Licklider might have actually been the one who did effectively invent it.  He convinced Bob Taylor of the idea that became ARPANET.  Taylor is another of those people who deserves recognition as after he created the initial proposal for ARPANET he went on to lead Xerox Parc for about 15 years from its inception.   Also Xerox Parc often seems to get the credit for our much of our modern computing interfaces, but again Douglas Engelbart really deserves that credit as he demonstrated most of those ideas in 1968 two years before Xerox established Parc. He of course was a big influence of that work at Parc. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A big driving force for the creation of practical computer technology was the need for machines to do tedious laborious mental work like large quantities of calculations especially to create &lt;a href=&quot;http://en.wikipedia.org/wiki/Mathematical_table&quot;&gt;mathematical tables&lt;/a&gt; that gave values of various computations such as logarithms which were used extensively prior to the 1970s before the advent of affordable desktop and pocket scientific calculators.  Babbage’s work was aimed at solving this problem.  During world war two the need for the creation of artillery tables exceeded the available human labor which drove the military to fund the creation of ENIAC, which was not delivered until after the war.  The war also drove the Bletchley park work, again an attempt to automate tedious work of trying to manually decipher the coded messages of the Enigma Machine.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimj4GT6T_eVqx76jA1y6uomNdpt-hS5DDtg-KuzFr21KR6MVOS5ez5ajvucp-IjCTr4JNEibv2j-2hcvkQjTBaycASMQYLq-UieJVowk24Mtmawp_Thv9-d4r7Jk7rwNtlIFUHn2CXNlrH/s1600/IBM_card_storage.NARA.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimj4GT6T_eVqx76jA1y6uomNdpt-hS5DDtg-KuzFr21KR6MVOS5ez5ajvucp-IjCTr4JNEibv2j-2hcvkQjTBaycASMQYLq-UieJVowk24Mtmawp_Thv9-d4r7Jk7rwNtlIFUHn2CXNlrH/s400/IBM_card_storage.NARA.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;clear: both; text-align: center;&quot;&gt;Big data circa 1950s. ~ 4GB of punched cards. &lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Big data is a common term today, but in many respects it has history going back over a hundred years and could be also considered a driver of the development of practical computer technology.  One continual source of big data was and probably still is, is collection of census data.  In 1889 Herman Hollerith developed an electromechanical tabulating machine that was used to process data for the 1890 US census.  His 1889 patent had the title &quot;Art of Compiling Statistics&quot; and he later established a company to sell the machines which were used worldwide for census and other applications. He is credited with laying the foundations of the modern information processing industry. His company was eventually merged with four others to become IBM.  In 1948 the US Census Bureau had a big data problem that was outgrowing the existing electromechanical technology.  John Mauchly one of the inventors of ENIAC and cofounder of Eckert–Mauchly Computer Corporation sold the census department on its successor named &lt;a href=&quot;http://en.wikipedia.org/wiki/UNIVAC_I&quot;&gt;UNIVAC&lt;/a&gt; to handle census data.  The company survives today as Unisys.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnYdXA43uZ2nzxVU_Yqh-jmQ5IaBxvpku7qqYjn4u0hdzJt6uiXQmF9BGY6gjYUHNpSCG-yIBfMXQPs7hxGaVrpDTNi5McYkomHZps7szx2iqOzMLm1i_okx6M64EjcQc-C4pj-8ppxB9F/s1600/Grace_Hopper_and_UNIVAC.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnYdXA43uZ2nzxVU_Yqh-jmQ5IaBxvpku7qqYjn4u0hdzJt6uiXQmF9BGY6gjYUHNpSCG-yIBfMXQPs7hxGaVrpDTNi5McYkomHZps7szx2iqOzMLm1i_okx6M64EjcQc-C4pj-8ppxB9F/s320/Grace_Hopper_and_UNIVAC.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div style=&quot;clear: both; text-align: center;&quot;&gt;Grace Murray Hopper at the UNIVAC keyboard&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;A huge problem with software projects today is that of project failure and the history of computing seems to have its share as well.  Software projects sometimes outright fail and all too often are late and over budget.  Babbage’s Difference Engine project which was cancelled after 15 years and an expenditure that was ten times the original amount paid.  The failure was due to bad management on his part and what might be called scope creep in that he got distracted by designing the more general Analytical Engine.  UNIVAC is another notable early project that was delivered late and over budget.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The real challenge of a post like this is what to include.  The Machine that Changed the World documentary starts with writing which was our first precise technique to record information.  I went back farther to include the recording of numerical information.  A big influence on the way I view history comes from a PBS show that aired in the eighties called &lt;a href=&quot;http://en.wikipedia.org/wiki/Connections_(TV_series)&quot;&gt;Connections&lt;/a&gt; which was done by &lt;a href=&quot;http://en.wikipedia.org/wiki/James_Burke_(science_historian)&quot;&gt;James Burke&lt;/a&gt;.  In it he traces in a very engaging way various technological developments as cause and effect events.  In a sense he demonstrated that history was an interesting living topic not the banal languid mimeographs that I experienced in school.  I tried to choose events that were either the inception of something or the point at which it caused a significant change.  In the spirit of Connections there are definite threads here, the thread of calculation and computation including number representation for those purposes. The thread of encryption also plays an important role as does dealing with information both in terms of storage, replication and processing.   Some of the threads are obvious and some are more subtle. &lt;/p&gt;&lt;a name=&quot;timeline&quot; /&gt;&lt;br /&gt;
&lt;h3&gt;History of Computing from Ancient to Modern&lt;/h3&gt;&lt;p&gt;&lt;a name=&quot;Pre3000&quot;/&gt;Pre 3000 BCE: &lt;a href=&quot;http://en.wikipedia.org/wiki/Tally_marks&quot;&gt;Tally Marks&lt;/a&gt;, a &lt;a href=&quot;http://en.wikipedia.org/wiki/Unary_numeral_system&quot;&gt;unary numeral system&lt;/a&gt;, are used to keep track of numerical quantities such as animal herd sizes.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4WIdhbWzt67kmdWHeNbAc2a1_M2hfesEythVVtzq1OORk2p3_a-E1qSbZK-_oU3zI8OT0kkOkRoMEW6ahwoiAkUIEjJuIFaRiI9p9fxSZ0zdvEUXNH98hUWz2ajkh8TZnCojFT2to1xzZ/s1600/Cuneiforme.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4WIdhbWzt67kmdWHeNbAc2a1_M2hfesEythVVtzq1OORk2p3_a-E1qSbZK-_oU3zI8OT0kkOkRoMEW6ahwoiAkUIEjJuIFaRiI9p9fxSZ0zdvEUXNH98hUWz2ajkh8TZnCojFT2to1xzZ/s200/Cuneiforme.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;c3200&quot;/&gt;c. 3200 BCE:  Mesopotamian &lt;a href=&quot;http://en.wikipedia.org/wiki/Cuneiform&quot;&gt;Cuneiform&lt;/a&gt; appears.  Writing may have been independently developed in other places as well. Although protowriting systems previously existed, society now had a more concise mechanism to record information.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c3000&quot;/&gt;c. 3000 BCE:  The development of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Egyptian_numerals&quot;&gt;Egyptian Hieroglyphic Number System&lt;/a&gt; and the Sumerian and &lt;a href=&quot;http://en.wikipedia.org/wiki/Babylonian_numerals&quot;&gt;Babylonian Number System&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Sexagesimal&quot;&gt;base 60&lt;/a&gt; number system is the start of non-unary number systems. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2800&quot;/&gt;2800 BCE: The appearance of the &lt;a href=&quot;http://en.wikipedia.org/wiki/I_Ching&quot;&gt;I Ching&lt;/a&gt; which included the &lt;a href=&quot;http://en.wikipedia.org/wiki/Bagua&quot;&gt;Bagua&lt;/a&gt; or eight &lt;a href=&quot;http://en.wikipedia.org/wiki/Trigram&quot;&gt;trigrams&lt;/a&gt; is possibly the first occurrence of binary numbers.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_Yhw71QHGIDILnYGHBAmKHnDbsWBgP_c2oRJINz6pDOLVWcufY_pnmYffaolozVBkormqjPr5cYEc0LdH8Y328YBvkiB4-9m_frbWCdmOZkxUYYnqe_0iMbaruLH04BQWvxqQ4Zf-c9o/s1600/Schoty_abacus.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgx_Yhw71QHGIDILnYGHBAmKHnDbsWBgP_c2oRJINz6pDOLVWcufY_pnmYffaolozVBkormqjPr5cYEc0LdH8Y328YBvkiB4-9m_frbWCdmOZkxUYYnqe_0iMbaruLH04BQWvxqQ4Zf-c9o/s200/Schoty_abacus.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;2700–2300&quot;/&gt;2700–2300 BCE: The Sumerian &lt;a href=&quot;http://en.wikipedia.org/wiki/Sexagesimal&quot;&gt;Sexagesimal&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Abacus&quot;&gt;Abacus&lt;/a&gt; allows human mechanical calculations.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c500&quot;/&gt;c. 500 BCE: &lt;a href=&quot;http://en.wikipedia.org/wiki/P%C4%81%E1%B9%87ini&quot;&gt;P&amp;#257;&amp;#7751;ini&lt;/a&gt; describes the grammar and morphology of Sanskrit.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c300&quot;/&gt;c. 300 BCE: &lt;a href=&quot;http://en.wikipedia.org/wiki/Euclid%27s_Elements&quot;&gt;Euclid&#39;s Elements&lt;/a&gt; describes among other things an &lt;a href=&quot;http://en.wikipedia.org/wiki/Euclidean_algorithm&quot;&gt;algorithm&lt;/a&gt; to compute the &lt;a href=&quot;http://en.wikipedia.org/wiki/Greatest_common_divisor&quot;&gt;greatest common divisor&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2qsYte-UaJ3kF-iQdSfdSwN4MTrdosNdOHGAbNN4jPwEQIXuF1jwUo3Hw0xVWh0ANXIAMYYyvRFoIcHNVz6HHU9bROjandXMQG2lMneQF8XuhMS4SwB1ZV4issFk4VtG8eY9g1hbo2DTa/s1600/Computer_graphic_for_front_of_Antikythera_mechanism.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2qsYte-UaJ3kF-iQdSfdSwN4MTrdosNdOHGAbNN4jPwEQIXuF1jwUo3Hw0xVWh0ANXIAMYYyvRFoIcHNVz6HHU9bROjandXMQG2lMneQF8XuhMS4SwB1ZV4issFk4VtG8eY9g1hbo2DTa/s200/Computer_graphic_for_front_of_Antikythera_mechanism.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;100 &quot;/&gt;100 BCE: The Greeks develop the &lt;a href=&quot;http://en.wikipedia.org/wiki/Antikythera_mechanism&quot;&gt;Antikythera mechanism&lt;/a&gt;, the first known mechanical computation device. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c5&quot;/&gt;c. 5 BCE:  The &lt;a href=&quot;http://en.wikipedia.org/wiki/Scytale&quot;&gt;scytale transposition cipher&lt;/a&gt; was used by the &lt;a href=&quot;http://en.wikipedia.org/wiki/Sparta&quot;&gt;Spartan&lt;/a&gt; military, although ciphers probably existed earlier.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c&quot;/&gt;c. 1 - 300 CE:  Hindu numeral system, later to become the &lt;a href=&quot;http://en.wikipedia.org/wiki/Hindu%E2%80%93Arabic_numeral_system&quot;&gt;Hindu–Arabic numeral system&lt;/a&gt;, is invented by Indian mathematicians.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c201&quot;/&gt;c. 201 - 299 CE: &lt;a href=&quot;http://en.wikipedia.org/wiki/Diophantus&quot;&gt;Diophantus&lt;/a&gt; authored a series of books called &lt;a href=&quot;http://en.wikipedia.org/wiki/Arithmetica&quot;&gt;Arithmetica&lt;/a&gt; which deal with solving algebraic equations.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c801&quot;/&gt;c. 801 - 873 CE: &lt;a href=&quot;http://en.wikipedia.org/wiki/Al-Kindi&quot;&gt;Al-Kindi&lt;/a&gt; develops cryptanalysis by frequency analysis.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCZslCvnD_PGIT8HUrX5zhEYLGif68gwjmnpgybyNvV8KowqymDuIEMBxnVAhUYx1jhgntmzMhKfIC0qCNdjEdYa6_q_vpqzy8mxysA17bjRM_2UzmilIQuUlfyKpYlgEZ7ytxM9lVllnu/s1600/Abu_Abdullah_Muhammad_bin_Musa_al-Khwarizmi_edit.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCZslCvnD_PGIT8HUrX5zhEYLGif68gwjmnpgybyNvV8KowqymDuIEMBxnVAhUYx1jhgntmzMhKfIC0qCNdjEdYa6_q_vpqzy8mxysA17bjRM_2UzmilIQuUlfyKpYlgEZ7ytxM9lVllnu/s200/Abu_Abdullah_Muhammad_bin_Musa_al-Khwarizmi_edit.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;c825&quot;/&gt;c. 825: &lt;a href=&quot;http://en.wikipedia.org/wiki/Al-Khwarizmi&quot;&gt;CE Mu&amp;#7717;ammad ibn M&amp;#363;s&amp;#257; al-Khw&amp;#257;rizm&amp;#299;&lt;/a&gt; writes &lt;u&gt;On the Calculation with Hindu Numerals&lt;/u&gt; which helps spread the Indian system of numeration throughout the Middle East and Europe. It is translated into Latin as Algoritmi de numero Indorum. Al-Khw&amp;#257;rizm&amp;#299;, rendered as (Latin) Algoritmi, leads to the term &quot;algorithm&quot;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;850 &quot;/&gt;850 CE: The &lt;a href=&quot;http://en.wikipedia.org/wiki/Banu_Musa&quot;&gt;Banu Musa&lt;/a&gt; publish &lt;a href=&quot;http://en.wikipedia.org/wiki/Book_of_Ingenious_Devices&quot;&gt;The Book of Ingenious Devices&lt;/a&gt; a large illustrated work on mechanical devices, including automata.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1202&quot;/&gt;1202: &lt;a href=&quot;http://en.wikipedia.org/wiki/Fibonacci&quot;&gt;Leonardo of Pisa (Fibonacci)&lt;/a&gt; introduces the Hindu–Arabic numbers to Europe in his book &lt;a href=&quot;http://en.wikipedia.org/wiki/Liber_Abaci&quot;&gt;Liber Abaci&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c1283&quot;/&gt;c. 1283: &lt;a href=&quot;http://en.wikipedia.org/wiki/Verge_escapement&quot;&gt;Verge escapement&lt;/a&gt; is developed in Europe and allows the development all-mechanical clocks and other mechanical automata.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0DXM3R4qvY4X-CPi-PtfV0AAuEeLOQEnOfguzxOFfhNVtJyYus4eGuwW65V9sy6YlGJ2Q-9Hp5l5Jn6KtdIwQUfHzu3-HmRbP5_oa1GGFRcObgnnam4KPdMwQtznemvjXNwlgzXdIUUXJ/s1600/372px-Printer_in_1568-ce.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0DXM3R4qvY4X-CPi-PtfV0AAuEeLOQEnOfguzxOFfhNVtJyYus4eGuwW65V9sy6YlGJ2Q-9Hp5l5Jn6KtdIwQUfHzu3-HmRbP5_oa1GGFRcObgnnam4KPdMwQtznemvjXNwlgzXdIUUXJ/s200/372px-Printer_in_1568-ce.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1450&quot;/&gt;1450:  Johannes Gutenberg invents the &lt;a href=&quot;http://en.wikipedia.org/wiki/Printing_press&quot;&gt;Printing Press&lt;/a&gt;, while actually invented earlier in Asia, it allows the mechanization of the duplication of information and creates &lt;a href=&quot;http://www.elegantcoding.com/2012/07/renaissance-20.html&quot;&gt;an industrial boom surrounding the selling and dissemination of information&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c1624&quot;/&gt;c. 1624: The &lt;a href=&quot;http://en.wikipedia.org/wiki/Slide_rule&quot;&gt;slide rule&lt;/a&gt; is developed to calculate logarithms.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1642&quot;/&gt;1642: &lt;a href=&quot;http://en.wikipedia.org/wiki/Blaise_Pascal&quot;&gt;Blaise Pascal&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Wilhelm_Schickard&quot;&gt;Wilhelm Schickard&lt;/a&gt; invent a mechanical calculator known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Pascal%27s_calculator&quot;&gt;Pascal&#39;s calculator&lt;/a&gt;. It is later discovered that Schickard had described the device to Johannes Kepler in 1623.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1654&quot;/&gt;1654: &lt;a href=&quot;http://en.wikipedia.org/wiki/Pierre_de_Fermat&quot;&gt;Pierre de Fermat’s&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Blaise_Pascal&quot;&gt;Blaise Pascal’s&lt;/a&gt; correspondence leads to mathematical methods of probability.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1679&quot;/&gt;1679: &lt;a href=&quot;http://en.wikipedia.org/wiki/Gottfried_Leibniz&quot;&gt;Gottfried Leibniz&lt;/a&gt; invents the modern &lt;a href=&quot;http://en.wikipedia.org/wiki/Binary_number&quot;&gt;binary number system&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1NbakA_27TEk9BtXP5obfi_-tPzAFSCC7_qtIAgKJTklRQzDoFGceBB9foY-VtxSIfp8ciAWn21Xpc6sK4ZfgF_wVkWi0yNT-ifc6JnahfR51FOhWBohdzLZszRTjoInjzw_Pz5iMRuf/s1600/Leibniz_Stepped_Reckoner_drawing.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1NbakA_27TEk9BtXP5obfi_-tPzAFSCC7_qtIAgKJTklRQzDoFGceBB9foY-VtxSIfp8ciAWn21Xpc6sK4ZfgF_wVkWi0yNT-ifc6JnahfR51FOhWBohdzLZszRTjoInjzw_Pz5iMRuf/s200/Leibniz_Stepped_Reckoner_drawing.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1694&quot;/&gt;1694: &lt;a href=&quot;http://en.wikipedia.org/wiki/Gottfried_Leibniz&quot;&gt;Gottfried Wilhelm Leibniz&lt;/a&gt; completes the &lt;a href=&quot;http://en.wikipedia.org/wiki/Stepped_Reckoner&quot;&gt;Stepped Reckoner&lt;/a&gt; a digital mechanical calculator that can perform all four arithmetic operations: addition, subtraction, multiplication and division.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1725&quot;/&gt;1725: &lt;a href=&quot;http://en.wikipedia.org/wiki/Basile_Bouchon&quot;&gt;Basile Bouchon&lt;/a&gt; first uses &lt;a href=&quot;http://en.wikipedia.org/wiki/Punched_card&quot;&gt;punched cards&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1736&quot;/&gt;1736: &lt;a href=&quot;http://en.wikipedia.org/wiki/Leonhard_Euler&quot;&gt;Leonhard Euler&lt;/a&gt; lays the foundation of graph theory and topology in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Seven_Bridges_of_Konigsberg&quot;&gt;Seven Bridges of Königsberg problem&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1763&quot;/&gt;1763: Two years after &lt;a href=&quot;http://en.wikipedia.org/wiki/Thomas_Bayes&quot;&gt;Thomas Bayes&lt;/a&gt; dies his &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/An_Essay_towards_solving_a_Problem_in_the_Doctrine_of_Chances&quot;&gt;An Essay towards solving a Problem in the Doctrine of Chances&lt;/a&gt;&quot; is published in the Philosophical Transactions of the Royal Society of London.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1786&quot;/&gt;1786: &lt;a href=&quot;http://en.wikipedia.org/wiki/Johann_Helfrich_von_M%C3%BCller&quot;&gt;J. H. Müller&lt;/a&gt; Hessian army engineer publishes a description of a Difference Engine.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitvtJh6kFpqklDE56J6B0OvolJP0g63C7sSOSkjuaInYLEw5EbjfxkfVRWAk8jfhlAicHRlSr_WVBIIM1wmwI8DNSyZoC8O-o6j5F8W3HpVe-yZtWsc8iS4RQqdYb2XrDKA7y6an_WO1YC/s1600/Jacquard.loom.cards+(1).jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitvtJh6kFpqklDE56J6B0OvolJP0g63C7sSOSkjuaInYLEw5EbjfxkfVRWAk8jfhlAicHRlSr_WVBIIM1wmwI8DNSyZoC8O-o6j5F8W3HpVe-yZtWsc8iS4RQqdYb2XrDKA7y6an_WO1YC/s200/Jacquard.loom.cards+(1).jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1801&quot;/&gt;1801: &lt;a href=&quot;http://en.wikipedia.org/wiki/Joseph_Marie_Jacquard&quot;&gt;Joseph Marie Jacquard&lt;/a&gt; demonstrates a working mechanical loom, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Jacquard_loom&quot;&gt;Jacquard Loom&lt;/a&gt;, that uses punch cards based on previous work by Jacques Vaucanson and Basile Bouchon.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxMPhyFgn4fV8LlDo6G9ygZFnoOgOJntjCmZJWmmP0CUGWEgA3vIHJrhRoUG1AZRG7LltdDY8mW4Q9_xzvaVP950Sfdi71-l9CzO8ZFANICjAVrSDJImLl1vBoqw6R2ccYIaexhRP7R71y/s1600/800px-LondonScienceMuseumsReplicaDifferenceEngine.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxMPhyFgn4fV8LlDo6G9ygZFnoOgOJntjCmZJWmmP0CUGWEgA3vIHJrhRoUG1AZRG7LltdDY8mW4Q9_xzvaVP950Sfdi71-l9CzO8ZFANICjAVrSDJImLl1vBoqw6R2ccYIaexhRP7R71y/s200/800px-LondonScienceMuseumsReplicaDifferenceEngine.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1805&quot;/&gt;1805/1809:  The &lt;a href=&quot;https://en.wikipedia.org/wiki/Least_squares&quot;&gt;least squares method&lt;/a&gt; is published by &lt;a href=&quot;https://en.wikipedia.org/wiki/Adrien-Marie_Legendre&quot;&gt;Legendre&lt;/a&gt; in 1805 and by &lt;a href=&quot;https://en.wikipedia.org/wiki/Carl_Friedrich_Gauss&quot;&gt;Gauss&lt;/a&gt; in 1809.&lt;br /&gt;
They both apply it to the problem of determining, from astronomical observations, the orbits of bodies about the sun. This is the earliest form of the linear regression.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1823&quot;/&gt;1823: The British government gives &lt;a href=&quot;http://en.wikipedia.org/wiki/Charles_Babbage&quot;&gt;Charles Babbage&lt;/a&gt; £1700 to start work on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Difference_engine&quot;&gt;Difference engine&lt;/a&gt; proposed the previous year.  In 1842 after a total expenditure of £17,000 without a deliverable the project was canceled.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1832&quot;/&gt;1832: &lt;a href=&quot;http://en.wikipedia.org/wiki/%C3%89variste_Galois&quot;&gt;Évariste Galois&lt;/a&gt; is killed in a duel leaving behind a legacy in algebraic theory to be discovered decades later.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1837&quot;/&gt;1837: Charles Babbage describes a successor to the Difference Engine, the Analytical Engine, a proposed mechanical general-purpose computer and the first design for a general-purpose computer that could be described in modern terms as Turing-complete.  Babbage receive assistance on this project from &lt;a href=&quot;http://en.wikipedia.org/wiki/Ada_Byron&quot;&gt;Ada Byron, Countess of Lovelace&lt;/a&gt;. It also serves to distract Babbage from completing the Difference Engine. Neither project is ever completed.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-5u6XDCfi5e2QzDM-wN9ptoPD-Uj28AMJqayo41vy8Ynpc1Yfiy2L63R1hFtLav_gWCPmOQxbqycWcKm1WxVC-6UoQ6nx7lBb2DJKnKdrPsviQMfw2tvENaLO-6uFQgVtWhwKlJyDpanU/s1600/International_Morse_Code.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-5u6XDCfi5e2QzDM-wN9ptoPD-Uj28AMJqayo41vy8Ynpc1Yfiy2L63R1hFtLav_gWCPmOQxbqycWcKm1WxVC-6UoQ6nx7lBb2DJKnKdrPsviQMfw2tvENaLO-6uFQgVtWhwKlJyDpanU/s200/International_Morse_Code.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1844&quot;/&gt;1844: &lt;a href=&quot;http://en.wikipedia.org/wiki/Samuel_Morse&quot;&gt;Samuel Morse&lt;/a&gt; demonstrates the &lt;a href=&quot;http://en.wikipedia.org/wiki/Telegraphy#Morse_system&quot;&gt;telegraph&lt;/a&gt; to Congress by transmitting the famous message &quot;What hath God wrought&quot; in &lt;a href=&quot;http://en.wikipedia.org/wiki/Morse_code&quot;&gt;Morse code&lt;/a&gt; over a wire from Washington to Baltimore.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1854 &quot;/&gt;1854 English mathematician &lt;a href=&quot;http://en.wikipedia.org/wiki/George_Boole&quot;&gt;George Boole&lt;/a&gt; publishes &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Laws_of_Thought&quot;&gt;&lt;u&gt;An Investigation of the Laws of Thought&lt;/u&gt;&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1878&quot;/&gt;1878: &lt;a href=&quot;http://en.wikipedia.org/wiki/Oberlin_Smith&quot;&gt;Oberlin Smith&lt;/a&gt; patents &lt;a href=&quot;http://en.wikipedia.org/wiki/Magnetic_recording#History&quot;&gt;magnetic storage&lt;/a&gt; in the form of wire recording.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit5QVeTWRo8qxfkwGLv5wo8r9FZX54LyI9jmUyPfjLSEjfp_5Mlwhom0hcoWmpJdAm3ooHfgiKn1tuSddhKGRjY5Jm3elRaVa7ZVo7DRHyA7plRYYxzqCdUQuamdk0V9vYHG8lQ2_b6HXi/s1600/640px-Hollerith_census_machine.CHM.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit5QVeTWRo8qxfkwGLv5wo8r9FZX54LyI9jmUyPfjLSEjfp_5Mlwhom0hcoWmpJdAm3ooHfgiKn1tuSddhKGRjY5Jm3elRaVa7ZVo7DRHyA7plRYYxzqCdUQuamdk0V9vYHG8lQ2_b6HXi/s200/640px-Hollerith_census_machine.CHM.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1889&quot;/&gt;1889: &lt;a href=&quot;http://en.wikipedia.org/wiki/Herman_Hollerith&quot;&gt;Herman Hollerith&lt;/a&gt; develops an &lt;a href=&quot;http://en.wikipedia.org/wiki/Tabulating_machine&quot;&gt;electromechanical tabulating machine&lt;/a&gt; using punched cards for the United States 1890 census.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1889&quot;/&gt;1889: Giuseppe Peano presents his &quot;The principles of arithmetic&quot;, based on the work of &lt;a href=&quot;http://en.wikipedia.org/wiki/Richard_Dedekind&quot;&gt;Dedekind&lt;/a&gt; and origination of &quot;primitive recursion&quot; begins formally with the &lt;a href=&quot;http://en.wikipedia.org/wiki/Peano_axioms&quot;&gt;axioms of Peano&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1897&quot;/&gt;1897: &lt;a href=&quot;http://en.wikipedia.org/wiki/Ferdinand_Braun&quot;&gt;Karl Ferdinand Braun&lt;/a&gt; builds the first &lt;a href=&quot;http://en.wikipedia.org/wiki/Cathode_ray_tube&quot;&gt;cathode-ray tube (CRT)&lt;/a&gt; and cathode ray tube oscilloscope.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1900&quot;/&gt;1900: German mathematician &lt;a href=&quot;http://en.wikipedia.org/wiki/David_Hilbert&quot;&gt;David Hilbert&lt;/a&gt; publishes a list of &lt;a href=&quot;http://en.wikipedia.org/wiki/Hilbert%27s_problems&quot;&gt;23 unsolved problems&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1906&quot;/&gt;1906: &lt;a href=&quot;https://en.wikipedia.org/wiki/Andrey_Markov&quot;&gt;Andrey Markov&lt;/a&gt; publishes his first paper on &lt;a href=&quot;https://en.wikipedia.org/wiki/Markov_chain&quot;&gt;Markov Chains&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQchHe9vZp3vgl7xiwhH1YJKI18gbeKF1pssK0Y9JJjEkzpB5zu_-KoYb5wYg1hbTNs9EcZu7ZqJMwnCp_Adtw13sTtc1XfdXTfPQNztuEKEk0_t_tkT2jNJ5qqpE0p_xaee-q-KQLkygP/s1600/291px-Dubulttriode_darbiibaa+(1).jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQchHe9vZp3vgl7xiwhH1YJKI18gbeKF1pssK0Y9JJjEkzpB5zu_-KoYb5wYg1hbTNs9EcZu7ZqJMwnCp_Adtw13sTtc1XfdXTfPQNztuEKEk0_t_tkT2jNJ5qqpE0p_xaee-q-KQLkygP/s200/291px-Dubulttriode_darbiibaa+(1).jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1907&quot;/&gt;1907: &lt;a href=&quot;http://en.wikipedia.org/wiki/Triode&quot;&gt;The thermionic triode&lt;/a&gt;, a vacuum tube, propels the electronics age forward, enabling amplified radio technology and long-distance telephony.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1910&quot;/&gt;1910: &lt;a href=&quot;http://en.wikipedia.org/wiki/Alfred_North_Whitehead&quot;&gt;Alfred North Whitehead&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Bertrand_Russell&quot;&gt;Bertrand Russell&lt;/a&gt; publish &lt;a href=&quot;http://en.wikipedia.org/wiki/Principia_Mathematica&quot;&gt;Principia Mathematica&lt;/a&gt; which introduces the idea of &lt;a href=&quot;http://en.wikipedia.org/wiki/System_of_types&quot;&gt;types&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1914&quot;/&gt;1914: Spanish engineer &lt;a href=&quot;http://en.wikipedia.org/wiki/Leonardo_Torres_y_Quevedo&quot;&gt;Leonardo Torres y Quevedo&lt;/a&gt; designs an electro-mechanical version of the Analytical Engine of Charles Babbage which includes floating-point arithmetic.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQVZaiRPeJYgmHka52fABrD3mD6nPWgY74N8G3WRKskErKWhSX5ITr-qykBWyAdD9rdEZo8TurpqC9NdQVH76msC5RLkQcgfvHiYCEdDocJJMsZgGf4P1DIKo5Z-08H301ejEE8_7xDWH/s1600/640px-Enigma-rotor-stack.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTQVZaiRPeJYgmHka52fABrD3mD6nPWgY74N8G3WRKskErKWhSX5ITr-qykBWyAdD9rdEZo8TurpqC9NdQVH76msC5RLkQcgfvHiYCEdDocJJMsZgGf4P1DIKo5Z-08H301ejEE8_7xDWH/s200/640px-Enigma-rotor-stack.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1918&quot;/&gt;1918: German engineer &lt;a href=&quot;http://en.wikipedia.org/wiki/Arthur_Scherbius&quot;&gt;Arthur Scherbius&lt;/a&gt; applied for a patent for a cipher machine using rotors which gives rise to the enigma machine, a family of related electro-mechanical rotor cipher machines used for enciphering and deciphering secret messages.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1928&quot;/&gt;1928: &lt;a href=&quot;http://en.wikipedia.org/wiki/David_Hilbert&quot;&gt;David Hilbert&lt;/a&gt; formulates the &lt;a href=&quot;http://en.wikipedia.org/wiki/Entscheidungsproblem&quot;&gt;Entscheidungsproblem&lt;/a&gt;, German for &#39;decision problem&#39;, from his 2nd and 10th problems. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1925 &quot;/&gt;1925 &lt;a href=&quot;http://en.wikipedia.org/wiki/Andrey_Kolmogorov&quot;&gt;Andrey Kolmogorov&lt;/a&gt; publishes &quot;On the principle of the excluded middle&quot;.  He supports most of &lt;a href=&quot;http://en.wikipedia.org/wiki/L._E._J._Brouwer&quot;&gt;Brouwer&#39;s&lt;/a&gt; results but disputes a few and proves that under a certain interpretation, all statements of classical formal logic can be formulated as those of &lt;a href=&quot;http://en.wikipedia.org/wiki/Intuitionist_logic&quot;&gt;intuitionistic logic&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1931&quot;/&gt;1931: &lt;a href=&quot;http://en.wikipedia.org/wiki/Kurt_G%C3%B6del&quot;&gt;Kurt Gödel&lt;/a&gt; publishes &quot;On Formally Undecidable Propositions of &quot;Principia Mathematica&quot; and Related Systems&quot;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1933&quot;/&gt;1933: &lt;a href=&quot;http://en.wikipedia.org/wiki/Andrey_Kolmogorov&quot;&gt;Andrey Kolmogorov&lt;/a&gt; publishes &lt;u&gt;Foundations of the Theory of Probability&lt;/u&gt;, laying the modern &lt;a href=&quot;http://en.wikipedia.org/wiki/Kolmogorov_axioms&quot;&gt;axiomatic foundations of probability theory&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1936&quot;/&gt;1936: &lt;a href=&quot;http://en.wikipedia.org/wiki/Alonzo_Church&quot;&gt;Alonzo Church&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Alan_Turing&quot;&gt;Alan Turing&lt;/a&gt; publish independent papers showing that a general solution to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Entscheidungsproblem&quot;&gt;Entscheidungsproblem&lt;/a&gt; is impossible.  Church’s paper introduces the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lambda_calculus&quot;&gt;Lambda Calculus&lt;/a&gt; and Turing’s paper introduces ideas that become known &lt;a href=&quot;http://en.wikipedia.org/wiki/Turing_machine&quot;&gt;Turing Machines&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1938 &quot;/&gt;1938 &lt;a href=&quot;http://en.wikipedia.org/wiki/Konrad_Zuse&quot;&gt;Konrad Zuse&lt;/a&gt; builds the &lt;a href=&quot;http://en.wikipedia.org/wiki/Z1_(computer)&quot;&gt;Z1&lt;/a&gt;, a binary electrically driven mechanical calculator. It is the first freely programmable computer which uses Boolean logic and binary floating point numbers.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1943 &quot;/&gt;1943 &lt;a href=&quot;http://en.wikipedia.org/wiki/Warren_McCulloch&quot;&gt;Warren McCulloch&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Walter_Pitts&quot;&gt;Walter Pitts&lt;/a&gt; publish &lt;a href=&quot;http://www.cse.chalmers.se/~coquand/AUTOMATA/mcp.pdf&quot;&gt;&lt;u&gt;A Logical Calculus Immanent in Nervous Activity &lt;/u&gt;&lt;/a&gt;(pdf) making significant contributions to the study of neural network theory, theory of automata, and the theory of computation and cybernetics.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1944&quot;/&gt;1944: The first &lt;a href=&quot;http://en.wikipedia.org/wiki/Colossus_computer&quot;&gt;Colossus computer&lt;/a&gt;, designed by British engineer &lt;a href=&quot;http://en.wikipedia.org/wiki/Tommy_Flowers&quot;&gt;Tommy Flowers&lt;/a&gt;, is operational at &lt;a href=&quot;http://en.wikipedia.org/wiki/Bletchley_Park&quot;&gt;Bletchley Park&lt;/a&gt;. It was designed to break the complex &lt;a href=&quot;http://en.wikipedia.org/wiki/Cryptanalysis_of_the_Lorenz_cipher&quot;&gt;Lorenz ciphers&lt;/a&gt; used by the Nazis during WWII and reduced the time to break Lorenz messages from weeks to hours.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1945&quot;/&gt;1945: &lt;a href=&quot;http://en.wikipedia.org/wiki/Samuel_Eilenberg&quot;&gt;Samuel Eilenberg&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Saunders_Mac_Lane&quot;&gt;Saunders Mac Lane&lt;/a&gt; introduce &lt;a href=&quot;http://en.wikipedia.org/wiki/Category_theory&quot;&gt;categories&lt;/a&gt;, functors, and natural transformations as part of their work in &lt;a href=&quot;http://en.wikipedia.org/wiki/Algebraic_topology&quot;&gt;algebraic topology&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1945&quot;/&gt;1945: &lt;a href=&quot;http://en.wikipedia.org/wiki/John_von_Neumann&quot;&gt;John von Neumann&lt;/a&gt; publishes the &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/First_Draft_of_a_Report_on_the_EDVAC&quot;&gt;First Draft of a Report on the EDVAC&lt;/a&gt;&quot; the first published description of the logical design of a computer using the stored-program concept which came to be known as the von Neumann architecture.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCT6x2RlVm8sBDyWBmtOZ0-4K9suknQr__AUKffSPaCRPXy1UWdO5ES75L3jcMPvlBYccfEuavR8oClmbdglFXIUmOQxX6Le9ipTRs3rNVOrKuODid8OnFpwRx1oFkBH4b62Gb51MGdqjm/s1600/H96566k.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCT6x2RlVm8sBDyWBmtOZ0-4K9suknQr__AUKffSPaCRPXy1UWdO5ES75L3jcMPvlBYccfEuavR8oClmbdglFXIUmOQxX6Le9ipTRs3rNVOrKuODid8OnFpwRx1oFkBH4b62Gb51MGdqjm/s200/H96566k.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1945&quot;/&gt;1945: &lt;a href=&quot;http://en.wikipedia.org/wiki/Grace_Hopper&quot;&gt;Grace Hopper&lt;/a&gt; records the first actual computer &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Software_bug&quot;&gt;bug&lt;/a&gt;&quot; - a moth stuck between relays.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1946&quot;/&gt;1946: J. Presper Eckert and John Mauchly found &lt;a href=&quot;http://en.wikipedia.org/wiki/Eckert%E2%80%93Mauchly_Computer_Corporation&quot;&gt;Mauchly Computer Corporation&lt;/a&gt;, the first commercial computer company.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1947&quot;/&gt;1947: &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Bardeen&quot;&gt;John Bardeen&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Walter_Brattain&quot;&gt;Walter Brattain&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/William_Shockley&quot;&gt;William Shockley&lt;/a&gt; invent the first &lt;a href=&quot;http://en.wikipedia.org/wiki/Point-contact_transistor&quot;&gt;point-contact transistor&lt;/a&gt;.  &lt;a href=&quot;http://en.wikipedia.org/wiki/John_R._Pierce&quot;&gt;John R. Pierce&lt;/a&gt;, supervisor of the team, coins the term &lt;a href=&quot;http://en.wikipedia.org/wiki/Transistor&quot;&gt;transistor&lt;/a&gt; a portmanteau of the term &quot;transfer resistor&quot;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1947&quot;/&gt;1947: &lt;a href=&quot;http://en.wikipedia.org/wiki/Frederic_Calland_Williams&quot;&gt;Freddie Williams&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Tom_Kilburn&quot;&gt;Tom Kilburn&lt;/a&gt; develop the &lt;a href=&quot;http://en.wikipedia.org/wiki/Williams_tube&quot;&gt;Williams–Kilburn tube&lt;/a&gt; the first random access memory, a cathode ray tube used as a computer memory to electronically store binary data.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1948&quot;/&gt;1948: &lt;a href=&quot;http://en.wikipedia.org/wiki/Claude_Shannon&quot;&gt;Claude Shannon&lt;/a&gt; publishes &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/A_Mathematical_Theory_of_Communication&quot;&gt;A Mathematical Theory of Communication&lt;/a&gt;&quot; as a two part series in the Bell System Technical Journal describing information entropy as a measure for the uncertainty in a message which essentially invents the field of information theory.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1948.1&quot;/&gt;1948: &lt;a href=&quot;http://en.wikipedia.org/wiki/Bernard_M._Oliver&quot;&gt;Bernard M. Oliver&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Claude_Shannon&quot;&gt;Claude Shannon&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/John_R._Pierce&quot;&gt;John R. Pierce&lt;/a&gt; publish &quot;The Philosophy of PCM&quot; after the application for the patents by Oliver and Shannon in 1946 and by John R. Pierce in 1945, both patent applications were of the same name: &quot;Communication System Employing Pulse Code Modulation&quot;.  All three are credited as the inventors of &lt;a href=&quot;http://en.wikipedia.org/wiki/Pulse_code_modulation&quot;&gt;PCM&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1948&quot;/&gt;1948: The world&#39;s first &lt;a href=&quot;http://en.wikipedia.org/wiki/Stored-program_computer&quot;&gt;stored-program computer&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Manchester_Small-Scale_Experimental_Machine&quot;&gt;Manchester Small-Scale Experimental Machine (SSEM)&lt;/a&gt;, nicknamed Baby, runs its first program.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1951&quot;/&gt;1951: &lt;a href=&quot;http://en.wikipedia.org/wiki/David_A._Huffman&quot;&gt;David A. Huffman&lt;/a&gt; devises &lt;a href=&quot;http://en.wikipedia.org/wiki/Huffman_encoding&quot;&gt;Huffman encoding&lt;/a&gt; for an assigned &lt;a href=&quot;http://en.wikipedia.org/wiki/Term_paper&quot; title=&quot;Term paper&quot;&gt;term paper&lt;/a&gt; for the problem of finding the most efficient binary code by his &lt;a href=&quot;http://en.wikipedia.org/wiki/MIT&quot; title=MIT&gt;MIT&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Information_theory&quot; title=&quot;Information theory&quot;&gt;information theory&lt;/a&gt; class professor &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_M._Fano&quot;&gt;Robert Fano&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1952&quot;/&gt;1952: &lt;a href=&quot;http://en.wikipedia.org/wiki/Thomas_Watson,_Jr.&quot;&gt;Tom Watson, Jr.&lt;/a&gt; becomes president of IBM and shifts the company’s direction away from electromechanical punched card systems towards electronic computers.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfB3H2DVlzTmsRLnzCyMacZcKXM8XAgWTQVrfc7RcmuNmTnU2aD4AM3mboqPFhuJjhzN_aVBBa_rONEF6EJvJokfJ9oY_EAJAiYAUCuikWeGfIX0yT7oj0Hq7JWu6AEiNzby2_lURWe6zb/s1600/480px-KL_CoreMemory.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfB3H2DVlzTmsRLnzCyMacZcKXM8XAgWTQVrfc7RcmuNmTnU2aD4AM3mboqPFhuJjhzN_aVBBa_rONEF6EJvJokfJ9oY_EAJAiYAUCuikWeGfIX0yT7oj0Hq7JWu6AEiNzby2_lURWe6zb/s200/480px-KL_CoreMemory.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1953&quot;/&gt;1953: &lt;a href=&quot;http://en.wikipedia.org/wiki/Jay_Forrester&quot;&gt;Jay Forrester&lt;/a&gt; installed &lt;a href=&quot;http://en.wikipedia.org/wiki/Magnetic-core_memory&quot;&gt;magnetic core memory&lt;/a&gt; on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Whirlwind_(computer)&quot;&gt;Whirlwind computer&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1956&quot;/&gt;1956: &lt;a href=&quot;http://en.wikipedia.org/wiki/Stephen_Cole_Kleene&quot;&gt;Stephen Cole Kleene&lt;/a&gt; describes &lt;a href=&quot;http://en.wikipedia.org/wiki/Regular_language&quot;&gt;regular languages&lt;/a&gt; using his mathematical notation called regular sets thereby inventing &lt;a href=&quot;http://en.wikipedia.org/wiki/Regular_expressions&quot;&gt;regular expressions&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1956.1&quot;/&gt;1956: Wen Tsing Chow invents &lt;a href=&quot;http://en.wikipedia.org/wiki/Programmable_read-only_memory&quot;&gt;Programmable Read Only Memory (PROM)&lt;/a&gt; at American Bosch Arma Corporation at the request of the United States Air Force to come up with a more flexible and secure way of storing the targeting constants in the Atlas E/F &lt;a href=&quot;http://en.wikipedia.org/wiki/ICBM&quot;&gt;ICBM&lt;/a&gt;&#39;s airborne digital computer.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1956.2&quot;/&gt;1956: IBM introduces the IBM 305 &lt;a href=&quot;http://en.wikipedia.org/wiki/IBM_305_RAMAC&quot;&gt;RAMAC&lt;/a&gt; the first commercial computer using a moving-head hard disk drive (magnetic disk storage) for secondary storage.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1956.3&quot;/&gt;1956: &lt;a href=&quot;http://en.wikipedia.org/wiki/William_Shockley&quot;&gt;William Shockley&lt;/a&gt; moves back to California to be close to his aging mother in Palo Alto and starts &lt;a href=&quot;http://en.wikipedia.org/wiki/Shockley_Semiconductor_Laboratory&quot;&gt;Shockley Semiconductor Laboratory&lt;/a&gt; in a small commercial lot in nearby Mountain View which sets the agrarian area with cheap land and populated with fruit orchards on a path to later become known as Silicon Valley.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1957&quot;/&gt;1957: &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Noyce&quot;&gt;Robert Noyce&lt;/a&gt;, Gordon Moore and six others known as the &quot;traitorous eight&quot; leave Shockley Semiconductor Laboratory to start &lt;a href=&quot;http://en.wikipedia.org/wiki/Fairchild_Semiconductor&quot;&gt;Fairchild Semiconductor&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1957.1&quot;/&gt;1957: &lt;a href=&quot;http://en.wikipedia.org/wiki/Noam_Chomsky&quot;&gt;Noam Chomsky&lt;/a&gt; publishes &lt;a href=&quot;http://en.wikipedia.org/wiki/Syntactic_Structures&quot;&gt;Syntactic Structures&lt;/a&gt; which includes ideas of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Phrase_structure_grammar&quot;&gt;phrase structure grammar&lt;/a&gt; and a finite state grammar, communication theoretic model based on a conception of language as a Markov process.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1957.2&quot;/&gt;1957: &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Backus#Life_and_career&quot;&gt;John Backus&lt;/a&gt; creates the first &lt;a href=&quot;http://en.wikipedia.org/wiki/Fortran&quot;&gt;FORTRAN&lt;/a&gt; compiler at IBM.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1957.3&quot;/&gt;1957:  Frank Rosenblatt invents the &lt;a href=&quot;https://en.wikipedia.org/wiki/Perceptron&quot;&gt;Perceptron&lt;/a&gt; at the Cornell Aeronautical Laboratory with naval research funding.  He publishes &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.588.3775&quot;&gt;The Perceptron: A Probabilistic Model for Information Storage and Organization in The Brain&lt;/a&gt;&quot; in  1958 .  It is initially implemented in software for the &lt;a href=&quot;https://en.wikipedia.org/wiki/IBM_704&quot;&gt;IBM 704&lt;/a&gt; and subsequently implemented in custom-built hardware as the &quot;Mark 1 Perceptron&quot;. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1958&quot;/&gt;1958: &lt;a href=&quot;http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)&quot;&gt;John McCarthy&lt;/a&gt; develops &lt;a href=&quot;http://en.wikipedia.org/wiki/Lisp_(programming_language)&quot;&gt;Lisp&lt;/a&gt; which is based on &lt;a href=&quot;http://en.wikipedia.org/wiki/Alonzo_Church&quot;&gt;Alonzo Church’s&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Lambda_calculus&quot;&gt;Lambda calculus&lt;/a&gt;. It also includes the new idea of a conditional if statement.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-hmMEoGs3tzeAcH6BY6-WdVRPlAtDcfi8pY3PyaMF1HraUpwuslnrOve39dF_XNLCM0FXAAOA8UDYCatYH1ElOOC4LkTGtxH30zJWCh3aeehK3YFD7iHB66o34CbkJzQ4LV_mfe6haNMt/s1600/Kilby_solid_circuit.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-hmMEoGs3tzeAcH6BY6-WdVRPlAtDcfi8pY3PyaMF1HraUpwuslnrOve39dF_XNLCM0FXAAOA8UDYCatYH1ElOOC4LkTGtxH30zJWCh3aeehK3YFD7iHB66o34CbkJzQ4LV_mfe6haNMt/s200/Kilby_solid_circuit.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1958.1&quot;/&gt;1958: &lt;a href=&quot;http://en.wikipedia.org/wiki/Jack_Kilby&quot;&gt;Jack Kilby&lt;/a&gt; develops the &lt;a href=&quot;http://en.wikipedia.org/wiki/Integrated_circuit&quot;&gt;integrated circuit&lt;/a&gt; made from germanium and gold wires at Texas Instruments.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1959&quot;/&gt;1959: &lt;a href=&quot;http://en.wikipedia.org/wiki/Jean_Hoerni&quot;&gt;Jean Hoerni&lt;/a&gt; develops the planar transistor and the &lt;a href=&quot;http://en.wikipedia.org/wiki/Planar_process&quot;&gt;planar manufacturing process&lt;/a&gt; at Fairchild Semiconductor.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1959.1&quot;/&gt;1959: &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Noyce&quot;&gt;Robert Noyce&lt;/a&gt; develops a more practical silicon version of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Integrated_circuit&quot;&gt;integrated circuit&lt;/a&gt; which has the &quot;wires&quot; between components built directly into the substrate.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1959.2&quot;/&gt;1959: Noam Chomsky publishes &quot;On Certain Formal Properties of Grammars&quot; which describes the &lt;a href=&quot;http://en.wikipedia.org/wiki/Chomsky_hierarchy&quot;&gt;Chomsky Hierarchy&lt;/a&gt; which includes its relation to &lt;a href=&quot;http://en.wikipedia.org/wiki/Automata_theory&quot;&gt;automata theory&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1959.3&quot;/&gt;1959: &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Backus#Life_and_career&quot;&gt;John Backus&lt;/a&gt; publishes &quot;The Syntax and Semantics of the Proposed International Algebraic Language of Zürich ACM-GAMM Conference&quot;. In the UNESCO Proceedings of the International Conference on Information Processing, which introduces a notation to describe the syntax of programming languages specifically context-free grammars, the notation later becomes known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form&quot;&gt;Backus Naur Form (BNF)&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1959.4&quot;/&gt;1959: &lt;a href=&quot;http://en.wikipedia.org/wiki/Arthur_Samuel&quot;&gt;Arthur Samuel&lt;/a&gt; defines machine learning as a &quot;Field of study that gives computers the ability to learn without being explicitly programmed&quot;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVJv48LgZ4xwSN3keEwPIN6POjmB4SgR6IHeQkGODgSNqN3-0UH8xdd-mtigg8TtpoYvUwlB5gzBSGNIV3SgHTBjI4LVVSclnh_Wmyvwq4DXYeaWWs2KRxv4ictc-sjjg-5aAs4WjNs7K5/s1600/RS-232-Cable-9-25.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVJv48LgZ4xwSN3keEwPIN6POjmB4SgR6IHeQkGODgSNqN3-0UH8xdd-mtigg8TtpoYvUwlB5gzBSGNIV3SgHTBjI4LVVSclnh_Wmyvwq4DXYeaWWs2KRxv4ictc-sjjg-5aAs4WjNs7K5/s200/RS-232-Cable-9-25.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1962&quot;/&gt;1962: The Radio Sector of the EIA introduces &lt;a href=&quot;http://en.wikipedia.org/wiki/RS-232&quot;&gt;RS-232&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1963&quot;/&gt;1963: American Standards Association publishes the first edition of ASCII - American Standard Code for Information Interchange.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1964&quot;/&gt;1964: The &lt;a href=&quot;http://en.wikipedia.org/wiki/CDC_6600&quot;&gt;CDC 6600&lt;/a&gt; is released. Designed by &lt;a href=&quot;http://en.wikipedia.org/wiki/Seymour_Cray&quot;&gt;Seymour Cray&lt;/a&gt;, it is dubbed a &lt;a href=&quot;http://en.wikipedia.org/wiki/Supercomputers&quot;&gt;supercomputer&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1964.1&quot;/&gt;1964: MIT, General Electric and Bell Labs form a consortium to develop of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Multics&quot;&gt;Multics&lt;/a&gt; Operating System.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1964.2&quot;/&gt;1964: &lt;a href=&quot;http://en.wikipedia.org/wiki/John_G._Kemeny&quot;&gt;John G. Kemeny&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Thomas_E._Kurtz&quot;&gt;Thomas E. Kurtz&lt;/a&gt; create the &lt;a href=&quot;http://en.wikipedia.org/wiki/BASIC&quot;&gt;BASIC language&lt;/a&gt; to enable students in fields other than science and mathematics to use computers.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1965&quot;/&gt;1965: &lt;a href=&quot;http://en.wikipedia.org/wiki/Gordon_Moore&quot;&gt;Gordon Moore&lt;/a&gt; describes a trend in the paper &quot;Cramming more components onto integrated circuits&quot; which becomes known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Moore%27s_law&quot;&gt;Moore’s Law&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1966&quot;/&gt;1966: &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Dennard&quot;&gt;Robert Dennard&lt;/a&gt; invents &lt;a href=&quot;http://en.wikipedia.org/wiki/Dynamic_Random_Access_Memory&quot;&gt;DRAM&lt;/a&gt; at the IBM Thomas J. Watson Research Center.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1968&quot;/&gt;1968: &lt;a href=&quot;http://en.wikipedia.org/wiki/Douglas_Engelbart&quot;&gt;Douglas Engelbart&lt;/a&gt; gives &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/The_Mother_of_All_Demos&quot;&gt;The Mother of All Demos&lt;/a&gt;&quot;, a demonstration that introduces a complete computer hardware/software system called the &lt;a href=&quot;http://en.wikipedia.org/wiki/NLS_(computer_system)&quot;&gt;oN-Line System (NLS)&lt;/a&gt;. It demonstrates many fundamental elements of modern personal computing: multiple windows, hypertext, graphics, efficient navigation and command input, video conferencing, the computer mouse, word processing, dynamic file linking, revision control, and a collaborative real-time editor (collaborative work).&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1968.1&quot;/&gt;1968: &lt;a href=&quot;http://en.wikipedia.org/wiki/Edsger_W._Dijkstra&quot;&gt;Edsger Dijkstra´s&lt;/a&gt; publishes &quot;GO TO considered harmful&quot; letter, in Communications of the ACM helping pave the way for &lt;a href=&quot;http://en.wikipedia.org/wiki/Structured_programming&quot;&gt;structured programming&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMbugjQZVO9EyRchOHa3_ENZ62PJUW4EJnqcn2O1oc6m1Ao9NEVqKemuDeMfa9gp_L3ObrBfubc3Nc1vtxdeX0K3kU7b_SP-_lpMbG7gAL9Pi2UEQMr7enpHQ4eVt5bjzs-td78oIFmIKy/s1600/511px-Dsky.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhMbugjQZVO9EyRchOHa3_ENZ62PJUW4EJnqcn2O1oc6m1Ao9NEVqKemuDeMfa9gp_L3ObrBfubc3Nc1vtxdeX0K3kU7b_SP-_lpMbG7gAL9Pi2UEQMr7enpHQ4eVt5bjzs-td78oIFmIKy/s200/511px-Dsky.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1968.2&quot;/&gt;1968: The &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_Guidance_Computer&quot;&gt;Apollo Guidance Computer&lt;/a&gt; makes its debut orbiting the Earth on Apollo 7. The &lt;a href=&quot;http://en.wikipedia.org/wiki/Cold_War&quot;&gt;Cold War&lt;/a&gt; and the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apollo_program&quot;&gt;Apollo program&lt;/a&gt; drive the demand for lighter more reliable computers using &lt;a href=&quot;http://en.wikipedia.org/wiki/Integrated_circuit&quot;&gt;integrated circuits&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1968.3&quot;/&gt;1968: ARPA approves &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Taylor_(computer_scientist)&quot;&gt;Bob Taylor’s&lt;/a&gt; plan for a computer network.  Bob Taylor along with &lt;a href=&quot;http://en.wikipedia.org/wiki/Ivan_Sutherland&quot;&gt;Ivan Sutherland&lt;/a&gt; were originally convinced of the idea by &lt;a href=&quot;http://en.wikipedia.org/wiki/J._C._R._Licklider&quot;&gt;J. C. R. Licklider&lt;/a&gt; who initially referred to the concept as an &quot;Intergalactic Computer Network&quot;.  Ivan Sutherland and Bob Taylor envisioned a computer communications network, that would in part, allow researchers to use computers provided to various corporate and academic sites by ARPA to make new software and other computer science results quickly and widely available.  The project became known as &lt;a href=&quot;http://en.wikipedia.org/wiki/ARPANET&quot;&gt;Arpanet&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1968.4&quot;/&gt;1968: &lt;a href=&quot;http://en.wikipedia.org/wiki/Arthur_C._Clarke&quot;&gt;Arthur C. Clarke&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Stanley_Kubrick&quot;&gt;Stanley Kubrick&lt;/a&gt; release &lt;a href=&quot;http://en.wikipedia.org/wiki/2001:_A_Space_Odyssey_(film)&quot;&gt;2001: A Space Odyssey&lt;/a&gt; a science fiction movie that features advanced computing technology including an AI computer named the &lt;a href=&quot;http://en.wikipedia.org/wiki/HAL_9000&quot;&gt;HAL 9000&lt;/a&gt; with a voice interface that manages ship operations. The astronauts use multimedia tablet technology (NewsPad) to catch up on family and worldwide events from Earth.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1968.5&quot;/&gt;1968: &lt;a href=&quot;http://en.wikipedia.org/wiki/Gordon_E._Moore&quot;&gt;Gordon E. Moore&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Noyce&quot;&gt;Robert Noyce&lt;/a&gt; found &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel&quot;&gt;Intel&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1969&quot;/&gt;1969: &lt;a href=&quot;http://en.wikipedia.org/wiki/Willard_Boyle&quot;&gt;Willard Boyle&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/George_E._Smith&quot;&gt;George E. Smith&lt;/a&gt; invent the &lt;a href=&quot;http://en.wikipedia.org/wiki/Charge-coupled_device&quot;&gt;charge-coupled device (CCD)&lt;/a&gt; at &lt;a href=&quot;http://en.wikipedia.org/wiki/American_Telephone_%26_Telegraph&quot;&gt;AT&amp;amp;T&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Bell_Labs&quot;&gt;Bell Labs&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1969.1&quot;/&gt;1969: &lt;a href=&quot;http://en.wikipedia.org/wiki/Ken_Thompson&quot;&gt;Ken Thompson&lt;/a&gt; creates his game &lt;a href=&quot;http://en.wikipedia.org/wiki/Space_Travel_(video_game)&quot;&gt;Space Travel&lt;/a&gt; on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Multics&quot;&gt;Multics Operating System&lt;/a&gt;. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1969.2&quot;/&gt;1969: Bell Labs pulls out of Multics consortium.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-i96T51IOOXO1DVQqKq3eQBHUwLROWOb4RU6hHpdGNuvBZPSv_T41cUerRtFXinM4q91pM-PmuyK1ZxoPeSYgxSjJcVNN4iXj_IcH3kzFUjjtBvrou7Yuz1qIuzttBtwVe7tIO6m8IwXA/s1600/Ken_n_dennis.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-i96T51IOOXO1DVQqKq3eQBHUwLROWOb4RU6hHpdGNuvBZPSv_T41cUerRtFXinM4q91pM-PmuyK1ZxoPeSYgxSjJcVNN4iXj_IcH3kzFUjjtBvrou7Yuz1qIuzttBtwVe7tIO6m8IwXA/s200/Ken_n_dennis.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1970&quot;/&gt;1970: Ken Thompson and Denis Ritche create a new lighter weight &quot;programmers workbench&quot; operating system with many of the robust features of Multics.  The new operating system runs its first application: Space Travel.  Denis Ritche coins the name Unics playing on the Multics name, later it becomes known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Unix&quot;&gt;Unix&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1970.1&quot;/&gt;1970: &lt;a href=&quot;http://en.wikipedia.org/wiki/Edgar_F._Codd&quot;&gt;Edgar F. Codd&lt;/a&gt; publishes &quot;A Relational Model of Data for Large Shared Data Banks&quot; which establishes a &lt;a href=&quot;http://en.wikipedia.org/wiki/Relational_model&quot;&gt;relational model&lt;/a&gt; for databases.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1970.2&quot;/&gt;1970: Xerox opens &lt;a href=&quot;http://en.wikipedia.org/wiki/Xerox_PARC&quot;&gt;Palo Alto Research Center (PARC)&lt;/a&gt; which attracts some of the United States’ top computer scientists. Under &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Taylor_(computer_scientist)&quot;&gt;Bob Taylor’s&lt;/a&gt; guidance as associate manager it produces many groundbreaking inventions that later transform computing, including &lt;a href=&quot;http://en.wikipedia.org/wiki/Laser_printer&quot;&gt;Laser printers&lt;/a&gt;, Computer-generated &lt;a href=&quot;http://en.wikipedia.org/wiki/Bitmap&quot;&gt;bitmap&lt;/a&gt; graphics, The &lt;a href=&quot;http://en.wikipedia.org/wiki/WYSIWYG&quot;&gt;WYSIWYG&lt;/a&gt; text editor, &lt;a href=&quot;http://en.wikipedia.org/wiki/Interpress&quot;&gt;Interpress&lt;/a&gt;, a resolution-independent graphical page-description language and the precursor to &lt;a href=&quot;http://en.wikipedia.org/wiki/PostScript&quot;&gt;PostScript&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller&quot;&gt;Model–view–controller&lt;/a&gt; software architecture.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxMAHGU0I6GZWeFBb-dcwwzviRS7RlBTQG2u94PMeLUskNNcjyc0NnzcA5ZemRHz8BYAkKGB1ORGLPifP4QA7Ax-spySuugQiv9aOIv6MfW_eq-Gf4J0essXOWYwHGji6-cNUn0CBGEh2o/s1600/Floppy_disk_2009_G1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxMAHGU0I6GZWeFBb-dcwwzviRS7RlBTQG2u94PMeLUskNNcjyc0NnzcA5ZemRHz8BYAkKGB1ORGLPifP4QA7Ax-spySuugQiv9aOIv6MfW_eq-Gf4J0essXOWYwHGji6-cNUn0CBGEh2o/s200/Floppy_disk_2009_G1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1971&quot;/&gt;1971: IBM introduces the first commercially available 8 inch &lt;a href=&quot;http://en.wikipedia.org/wiki/Floppy_disk&quot;&gt;floppy diskette&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1971.1&quot;/&gt;1971: Intel introduces the first commercially available &lt;a href=&quot;http://en.wikipedia.org/wiki/Microprocessor&quot;&gt;microprocessor&lt;/a&gt; the 4-bit &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel_4004&quot;&gt;4004&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1971.2&quot;/&gt;1971: &lt;a href=&quot;http://en.wikipedia.org/wiki/Ray_Tomlinson&quot;&gt;Raymond Tomlinson&lt;/a&gt; implements the first &lt;a href=&quot;http://en.wikipedia.org/wiki/Email&quot;&gt;email&lt;/a&gt; system able to send mail between users on different hosts connected to the &lt;a href=&quot;http://en.wikipedia.org/wiki/ARPAnet&quot;&gt;ARPAnet&lt;/a&gt;.  To achieve this, he uses the @ sign to separate the user from their machine, which has been used in email addresses ever since.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1972.3&quot;/&gt;1972: &lt;a href=&quot;http://en.wikipedia.org/wiki/T_Peter_Brody&quot;&gt;Peter Brody&#39;s&lt;/a&gt; team at Westinghouse produces the first &lt;a href=&quot;http://en.wikipedia.org/wiki/Active-matrix&quot;&gt;active-matrix&lt;/a&gt; liquid-crystal display panel.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM7mTUTO452R2KQXSNEZt1hbjt9UXiY4OEp4EfVpEdDhtsEak5j242L6fje9zLZFLV2kC2rtFlJqNQc6vgTG8vEbaqNwj8OQs2FHo6EeNjQCYWNFstJ03A8AmerfabFExpzWnPQNauHPN1/s1600/426px-HP_35_Calculator.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM7mTUTO452R2KQXSNEZt1hbjt9UXiY4OEp4EfVpEdDhtsEak5j242L6fje9zLZFLV2kC2rtFlJqNQc6vgTG8vEbaqNwj8OQs2FHo6EeNjQCYWNFstJ03A8AmerfabFExpzWnPQNauHPN1/s200/426px-HP_35_Calculator.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1972&quot;/&gt;1972: Hewlett-Packard introduces the &lt;a href=&quot;http://en.wikipedia.org/wiki/HP-35&quot;&gt;HP-35&lt;/a&gt; the world&#39;s first scientific &lt;a href=&quot;http://en.wikipedia.org/wiki/Pocket_calculator&quot;&gt;pocket calculator&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1973&quot;/&gt;1973: Eckert and Mauchly &lt;a href=&quot;http://en.wikipedia.org/wiki/Honeywell_v._Sperry_Rand&quot;&gt;Eniac patent is invalidated&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1973.1&quot;/&gt;1973: &lt;a href=&quot;http://en.wikipedia.org/wiki/Robert_Metcalfe&quot;&gt;Robert Metcalfe&lt;/a&gt; devises the &lt;a href=&quot;http://en.wikipedia.org/wiki/Ethernet&quot;&gt;Ethernet&lt;/a&gt; method of network connection at the Xerox Parc. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1973&quot;/&gt;1973: &lt;a href=&quot;http://en.wikipedia.org/wiki/Gary_Kildall&quot;&gt;Gary Kildall&lt;/a&gt; develops &lt;a href=&quot;http://en.wikipedia.org/wiki/CP/M&quot;&gt;CP/M&lt;/a&gt; which stands for &quot;Control Program/Monitor&quot;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1974&quot;/&gt;1974: &lt;a href=&quot;http://en.wikipedia.org/wiki/Vint_Cerf&quot;&gt;Vint Cerf&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Bob_Kahn&quot;&gt;Bob Kahn&lt;/a&gt; publish a paper titled &quot;A Protocol for Packet Network Intercommunication&quot; describing an internetworking protocol for sharing resources using packet-switching among the nodes which was henceforth called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Internet_protocol_suite&quot;&gt;Internet Protocol Suite&lt;/a&gt;, and informally known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Transmission_Control_Protocol&quot;&gt;TCP/IP&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU0Xw0CkGyVsFoytFXXgRAoi8nrM9Y6uwPHlg1s3M1hmjhffviowU1WJ4IJS0FwJHvc7dZlJsSSVokuIiFUfZFU44i_46A09MCrqSorpkgdEfn9Z2CW68jCYJHrlbO6oidDTuWhfcd3TR-/s1600/Altair_8800_Computer.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU0Xw0CkGyVsFoytFXXgRAoi8nrM9Y6uwPHlg1s3M1hmjhffviowU1WJ4IJS0FwJHvc7dZlJsSSVokuIiFUfZFU44i_46A09MCrqSorpkgdEfn9Z2CW68jCYJHrlbO6oidDTuWhfcd3TR-/s200/Altair_8800_Computer.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1975&quot;/&gt;1975: The January edition of Popular Electronics featured the &lt;a href=&quot;http://en.wikipedia.org/wiki/Micro_Instrumentation_and_Telemetry_Systems&quot;&gt;MITS&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Altair_8800&quot;&gt;Altair 8800 computer kit&lt;/a&gt;, based on Intel´s &lt;a href=&quot;http://en.wikipedia.org/wiki/Intel_8080&quot;&gt;8080 microprocessor&lt;/a&gt;, on its cover.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1975.1&quot;/&gt;1975: &lt;a href=&quot;http://en.wikipedia.org/wiki/Bill_Gates&quot;&gt;Bill Gates&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Paul_Allen&quot;&gt;Paul Allen&lt;/a&gt; found &lt;a href=&quot;http://en.wikipedia.org/wiki/Microsoft&quot;&gt;Microsoft&lt;/a&gt; to develop and sell BASIC interpreters for Altair 8800.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1975.2&quot;/&gt;1975: Softlab Munich releases &lt;a href=&quot;http://en.wikipedia.org/wiki/Maestro_I&quot;&gt;Maestro I&lt;/a&gt; the world&#39;s first &lt;a href=&quot;http://en.wikipedia.org/wiki/Integrated_development_environment&quot;&gt;integrated development environment (IDE)&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1975.3&quot;/&gt;1975: &lt;a href=&quot;http://en.wikipedia.org/wiki/Frederick_Brooks&quot;&gt;Frederick Brooks&lt;/a&gt; publishes &lt;u&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/The_Mythical_Man-Month&quot;&gt;The Mythical Man-Month: Essays on Software Engineering&lt;/a&gt;&lt;/u&gt; is a book on software engineering and project management&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1976&quot;/&gt;1976: &lt;a href=&quot;http://en.wikipedia.org/wiki/Kenneth_Appel&quot;&gt;Kenneth Appel&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Wolfgang_Haken&quot;&gt;Wolfgang Haken&lt;/a&gt; prove the &lt;a href=&quot;http://en.wikipedia.org/wiki/Four_Color_Theorem&quot;&gt;Four Color Theorem&lt;/a&gt; by computer, the first major mathematical proof to be proven by a computer.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1977&quot;/&gt;1977: &lt;a href=&quot;http://en.wikipedia.org/wiki/Ron_Rivest&quot;&gt;Ron Rivest&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Adi_Shamir&quot;&gt;Adi Shamir&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Leonard_Adleman&quot;&gt;Leonard Adleman&lt;/a&gt; publicly describe the &lt;a href=&quot;http://en.wikipedia.org/wiki/RSA_(cryptosystem)&quot;&gt;RSA cryptosystem&lt;/a&gt;, the first practicable public-key cryptosystem.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1977.1&quot;/&gt;1977: Apple introduces the &lt;a href=&quot;http://en.wikipedia.org/wiki/Apple_II&quot;&gt;Apple II&lt;/a&gt;, designed primarily by &lt;a href=&quot;http://en.wikipedia.org/wiki/Steve_Wozniak&quot;&gt;Steve Wozniak&lt;/a&gt;,  it is one of the first highly successful mass-produced microcomputer products.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlzH-lpqPTO4znajPq9yaEA36NGU9gcAQ5czNPChp6u7fU2csRZmVpsqhRrvvpG5KPnNCelSh0cnKJ8RH5PyG77v5cOHQhJrRITYGLSbc3dV24mbwRd88FtdEpP7zj5rhIQCxo5Cw4B_mN/s1600/Atari2600wood4.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlzH-lpqPTO4znajPq9yaEA36NGU9gcAQ5czNPChp6u7fU2csRZmVpsqhRrvvpG5KPnNCelSh0cnKJ8RH5PyG77v5cOHQhJrRITYGLSbc3dV24mbwRd88FtdEpP7zj5rhIQCxo5Cw4B_mN/s200/Atari2600wood4.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1977.2&quot;/&gt;1977 &lt;a href=&quot;http://en.wikipedia.org/wiki/Atari,_Inc&quot;&gt;Atari, Inc&lt;/a&gt; releases The &lt;a href=&quot;http://en.wikipedia.org/wiki/Atari_2600&quot;&gt;Atari 2600&lt;/a&gt;, a microprocessor-based hardware &lt;a href=&quot;http://en.wikipedia.org/wiki/Video_game_console&quot;&gt;video game console&lt;/a&gt; with &lt;a href=&quot;http://en.wikipedia.org/wiki/ROM_cartridge&quot;&gt;ROM cartridges&lt;/a&gt; containing game code.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1978&quot;/&gt;1978: &lt;a href=&quot;http://en.wikipedia.org/wiki/Brian_Kernighan&quot;&gt;Brian Kernighan&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Dennis_Ritchie&quot;&gt;Dennis Ritchie&lt;/a&gt; publish &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/The_C_Programming_Language&quot;&gt;K&amp;amp;R&quot;&lt;/a&gt; establishing a de facto standard for the &lt;a href=&quot;http://en.wikipedia.org/wiki/C_(programming_language)&quot;&gt;C programming language&lt;/a&gt;, later in 1989 the &lt;a href=&quot;http://en.wikipedia.org/wiki/American_National_Standards_Institute&quot;&gt;American National Standards Institute&lt;/a&gt; published a standard for C (generally called &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/ANSI_C&quot;&gt;ANSI C&lt;/a&gt;&quot; or &quot;C89&quot;).  Development of C was started by Dennis Ritchie and Ken Thompson in 1969 in conjunction with the development of the UNIX operating system.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1978.1&quot;/&gt;1978: University of North Carolina at Chapel Hill and Duke University publicly establish &lt;a href=&quot;http://en.wikipedia.org/wiki/Usenet&quot;&gt;Usenet&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1979&quot;/&gt;1979: &lt;a href=&quot;http://en.wikipedia.org/wiki/Dan_Bricklin&quot;&gt;Dan Bricklin&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Bob_Frankston&quot;&gt;Bob Frankston&lt;/a&gt; found Software Arts, Inc., and began selling &lt;a href=&quot;http://en.wikipedia.org/wiki/VisiCalc&quot;&gt;VisiCalc&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1980&quot;/&gt;1980: &lt;a href=&quot;http://en.wikipedia.org/wiki/Smalltalk&quot;&gt;Smalltalk&lt;/a&gt; (Smalltalk80) a Xerox Parc project led by &lt;a href=&quot;http://en.wikipedia.org/wiki/Alan_Kay&quot;&gt;Allan Kay&lt;/a&gt; since the early 1970’s is released to the public.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;c1980&quot;/&gt;c. 1980: &lt;a href=&quot;http://en.wikipedia.org/wiki/Fujio_Masuoka&quot;&gt;Fujio Masuoka&lt;/a&gt; while working for Toshiba invents both &lt;a href=&quot;http://en.wikipedia.org/wiki/NAND_flash#NOR_memories&quot;&gt;NOR&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/NAND_flash#NAND_memories&quot;&gt;NAND&lt;/a&gt; types of Flash memory&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1981&quot;/&gt;1981: IBM introduces the &lt;a href=&quot;http://en.wikipedia.org/wiki/IBM_Personal_Computer&quot;&gt;IBM PC&lt;/a&gt;.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglbyJGiVfrJvLORvfG2xkL6FOfK1vjDYVHAjofLcN6NaF0DdYQ-4qv4rL0IeOY8CpG0iA_MDFBSCxL0WRbi71MVftdcm9PeZ6xzel9y_MHfzzRJxNS9rQ-CIO4M_RiVZ4RX2uryQcJWoHN/s1600/Macintosh_128k_transparency.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglbyJGiVfrJvLORvfG2xkL6FOfK1vjDYVHAjofLcN6NaF0DdYQ-4qv4rL0IeOY8CpG0iA_MDFBSCxL0WRbi71MVftdcm9PeZ6xzel9y_MHfzzRJxNS9rQ-CIO4M_RiVZ4RX2uryQcJWoHN/s200/Macintosh_128k_transparency.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1984&quot;/&gt;1984: Apple Computer launched the &lt;a href=&quot;http://en.wikipedia.org/wiki/Macintosh&quot;&gt;Macintosh&lt;/a&gt;, Based on the Motorola &lt;a href=&quot;http://en.wikipedia.org/wiki/Motorola_68000&quot;&gt;68000 microprocessor&lt;/a&gt;, it is the first successful mouse-driven computer with a graphic user interface.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1984.1&quot;/&gt;1984: &lt;a href=&quot;http://en.wikipedia.org/wiki/Abraham_Lempel&quot;&gt;Abraham Lempel&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Jacob_Ziv&quot;&gt;Jacob Ziv&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Terry_Welch&quot;&gt;Terry Welch&lt;/a&gt; publish the Lempel–Ziv–Welch (LZW) compression algorithm.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1985&quot;/&gt;1985: &lt;a href=&quot;http://en.wikipedia.org/wiki/Bjarne_Stroustrup&quot;&gt;Bjarne Stroustrup&lt;/a&gt; publishes The &lt;a href=&quot;http://en.wikipedia.org/wiki/The_C%2B%2B_Programming_Language&quot;&gt;C++ Programming Language&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1989&quot;/&gt;1989: &lt;a href=&quot;http://en.wikipedia.org/wiki/Tim_Berners-Lee&quot;&gt;Tim Berners-Lee&lt;/a&gt; proposes the &quot;WorldWideWeb&quot; project and builds the first Web Server and Web Client using &lt;a href=&quot;http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol&quot;&gt;HTTP&lt;/a&gt; and HTML all of which lays the foundation for what becomes the &lt;a href=&quot;http://en.wikipedia.org/wiki/World_Wide_Web&quot;&gt;World Wide Web&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1991&quot;/&gt;1991: Linus Torvalds releases Linux to several Usenet newsgroups.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1991.1&quot;/&gt;1991: &lt;a href=&quot;http://en.wikipedia.org/wiki/Eugenio_Moggi&quot;&gt;Eugenio Moggi&lt;/a&gt; publishes &quot;&lt;a href=&quot;http://www.disi.unige.it/person/MoggiE/ftp/ic91.pdf&quot;&gt;Notions of Computation and Monads&lt;/a&gt;&quot; (pdf) which describes the general use of monads to structure programs.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQOwwlk2bmLsQsnHAqvKjE7omhU0p5QaK1IAsNlpRlm4_dl837jH3nlr9xGYpxXeYM8lxjxkLd2YF_0Rzn3a4moEaO1EO-5NCgzTj8xKYJsccCJfySIja77NIhzQTtIJP3MU36HcrLBw2W/s1600/Felis_silvestris_silvestris_small_gradual_decrease_of_quality.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQOwwlk2bmLsQsnHAqvKjE7omhU0p5QaK1IAsNlpRlm4_dl837jH3nlr9xGYpxXeYM8lxjxkLd2YF_0Rzn3a4moEaO1EO-5NCgzTj8xKYJsccCJfySIja77NIhzQTtIJP3MU36HcrLBw2W/s200/Felis_silvestris_silvestris_small_gradual_decrease_of_quality.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;1992&quot;/&gt;1992: The first &lt;a href=&quot;http://en.wikipedia.org/wiki/JPEG&quot;&gt;JPEG&lt;/a&gt; standard and the &lt;a href=&quot;http://en.wikipedia.org/wiki/MPEG-1&quot;&gt;MPEG-1&lt;/a&gt; standard are released.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1993&quot;/&gt;1993: &lt;a href=&quot;http://en.wikipedia.org/wiki/Marc_Andreessen&quot;&gt;Marc Andreessen&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Eric_Bina&quot;&gt;Eric Bina&lt;/a&gt; release the &lt;a href=&quot;http://en.wikipedia.org/wiki/Mosaic_(web_browser)&quot;&gt;Mosaic&lt;/a&gt; Web Browser.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1994&quot;/&gt;1994: &lt;a href=&quot;http://en.wikipedia.org/wiki/Jeff_Bezos&quot;&gt;Jeff Bezos&lt;/a&gt; founds &lt;a href=&quot;http://en.wikipedia.org/wiki/Amazon.com&quot;&gt;Amazon.com&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1994.1&quot;/&gt;1994: &lt;a href=&quot;http://en.wikipedia.org/wiki/Erich_Gamma&quot;&gt;Erich Gamma&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Richard_Helm&quot;&gt;Richard Helm&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Ralph_Johnson_(computer_scientist)&quot;&gt;Ralph Johnson&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/John_Vlissides&quot;&gt;John Vlissides&lt;/a&gt;, known as the &quot;gang of four&quot; publish &lt;a href=&quot;http://en.wikipedia.org/wiki/Design_Patterns&quot;&gt;Design Patterns: Elements of Reusable Object-Oriented Software&lt;/a&gt;.  Subsequently in 1999 are &lt;a href=&quot;http://c2.com/cgi/wiki?ShowTrialOfTheGangOfFour&quot;&gt;found guilty&lt;/a&gt; by The International Tribunal for the Prosecution of Crimes against Computer Science by a two thirds majority.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1995&quot;/&gt;1995: &lt;a href=&quot;http://en.wikipedia.org/wiki/NSFNET&quot;&gt;NSFNET&lt;/a&gt; is decommissioned, removing the last restrictions on the use of the Internet to carry commercial traffic.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1996&quot;/&gt;1996: &lt;a href=&quot;http://en.wikipedia.org/wiki/Larry_Page&quot;&gt;Larry Page&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Sergey_Brin&quot;&gt;Sergey Brin&lt;/a&gt; develop the &lt;a href=&quot;http://en.wikipedia.org/wiki/PageRank&quot;&gt;PageRank&lt;/a&gt; algorithm and found &lt;a href=&quot;http://en.wikipedia.org/wiki/Google&quot;&gt;Google&lt;/a&gt; two years later.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1997&quot;/&gt;1997: &lt;a href=&quot;http://en.wikipedia.org/wiki/Nullsoft&quot;&gt;Nullsoft&lt;/a&gt; releases &lt;a href=&quot;http://en.wikipedia.org/wiki/Winamp&quot;&gt;Winamp&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1998&quot;/&gt;1998: &lt;a href=&quot;http://en.wikipedia.org/wiki/Diamond_Multimedia&quot;&gt;Diamond Multimedia&lt;/a&gt; releases The &lt;a href=&quot;http://en.wikipedia.org/wiki/Rio_PMP300&quot;&gt;Rio PMP300&lt;/a&gt;, the first commercially successful portable consumer &lt;a href=&quot;http://en.wikipedia.org/wiki/MP3&quot;&gt;MP3&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Digital_audio_player&quot;&gt;digital audio player&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1999&quot;/&gt;1999: &lt;a href=&quot;http://en.wikipedia.org/wiki/Napster&quot;&gt;Napster&lt;/a&gt; is released as an unstructured centralized peer-to-peer system.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1999.1&quot;/&gt;1999: Darcy DiNucci coins the term &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_2.0&quot;&gt;Web 2.0&lt;/a&gt; to describe &lt;a href=&quot;http://en.wikipedia.org/wiki/World_Wide_Web&quot;&gt;World Wide Web&lt;/a&gt; sites that use technology beyond the static pages of earlier Web sites including &lt;a href=&quot;http://en.wikipedia.org/wiki/Social_networking_site&quot;&gt;social networking sites&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Blog&quot;&gt;blogs&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Wiki&quot;&gt;wikis&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Folksonomy&quot;&gt;folksonomies&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Video_sharing&quot;&gt;video sharing&lt;/a&gt; sites, &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_service&quot;&gt;hosted services&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_application&quot;&gt;Web applications&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29&quot;&gt;mashups&lt;/a&gt;.. The term is later popularized by &lt;a href=&quot;http://en.wikipedia.org/wiki/Tim_O%27Reilly&quot;&gt;Tim O&#39;Reilly&lt;/a&gt; at the &lt;a href=&quot;http://en.wikipedia.org/wiki/O%27Reilly_Media&quot;&gt;O&#39;Reilly Media&lt;/a&gt; Web 2.0 conference in late 2004.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;1999.2&quot;/&gt;1999:  The &lt;a href=&quot;http://en.wikipedia.org/wiki/Wi-Fi_Alliance&quot;&gt;Wi-Fi Alliance&lt;/a&gt; formed as a trade association to hold the Wi-Fi trademark under which most products are sold.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2001&quot;/&gt;2001: &lt;a href=&quot;http://en.wikipedia.org/wiki/Jimmy_Wales&quot;&gt;Jimmy Wales&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Larry_Sanger&quot;&gt;Larry Sanger&lt;/a&gt; launch &lt;a href=&quot;http://en.wikipedia.org/wiki/Wikipedia&quot;&gt;Wikipedia&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2004&quot;/&gt;2004: &lt;a href=&quot;http://en.wikipedia.org/wiki/Google&quot;&gt;Google&lt;/a&gt; acquires Sydney-based company Where 2 Technologies and transforms its technology into the web application &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_Maps&quot;&gt;Google Maps&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2006&quot;/&gt;2006: &lt;a href=&quot;http://en.wikipedia.org/wiki/Amazon.com&quot;&gt;Amazon&lt;/a&gt; launches &lt;a href=&quot;http://en.wikipedia.org/wiki/Amazon_Web_Services&quot;&gt;Amazon Web Services&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2007&quot;/&gt;2007: Apple releases the &lt;a href=&quot;http://en.wikipedia.org/wiki/IPhone&quot;&gt;iPhone&lt;/a&gt; setting the design of the modern &lt;a href=&quot;http://en.wikipedia.org/wiki/Smartphone&quot;&gt;smart phone&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2010&quot;/&gt;2010: Apple releases the &lt;a href=&quot;http://en.wikipedia.org/wiki/IPad&quot;&gt;iPad&lt;/a&gt; shaping &lt;a href=&quot;http://en.wikipedia.org/wiki/Tablet_computer&quot;&gt;tablet computer&lt;/a&gt; technology that started over &lt;a href=&quot;http://en.wikipedia.org/wiki/GRiD_Systems&quot;&gt;20 years prior&lt;/a&gt; to its current character.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2010.1&quot;/&gt;2010: &lt;a href=&quot;http://en.wikipedia.org/wiki/Siri&quot;&gt;Siri&lt;/a&gt; is released by Siri Inc on &lt;a href=&quot;http://en.wikipedia.org/wiki/IOS&quot;&gt;iOS&lt;/a&gt; and subsequently acquired by Apple.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2012&quot;/&gt;2012: The &lt;a href=&quot;http://en.wikipedia.org/wiki/LHC_Computing_Grid&quot;&gt;LHC Computing Grid&lt;/a&gt; becomes the world&#39;s largest &lt;a href=&quot;http://en.wikipedia.org/wiki/Computing_grid&quot;&gt;computing grid&lt;/a&gt;, comprising over 170 computing facilities in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Distributed_computing&quot;&gt;worldwide network&lt;/a&gt; across 36 countries.&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEittg7zyIEZTJL4mxTo1fw1FxYZoxlJqNUwyrziMrQWGDJuHXMZG9tMiNzOC8cgr45AGyJiXTsoC0m68SPm3yVWSuvlI4fpGTJ6PiPTHtzoktHX2p7m9pr3NQNeQg62i1CZiV696ZGJi2QR/s1600/Raspberry_Pi_B+_top.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEittg7zyIEZTJL4mxTo1fw1FxYZoxlJqNUwyrziMrQWGDJuHXMZG9tMiNzOC8cgr45AGyJiXTsoC0m68SPm3yVWSuvlI4fpGTJ6PiPTHtzoktHX2p7m9pr3NQNeQg62i1CZiV696ZGJi2QR/s200/Raspberry_Pi_B+_top.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a name=&quot;2012&quot;/&gt;2012: The Raspberry Pi Foundation ships the first batch of &lt;a href=&quot;http://en.wikipedia.org/wiki/Raspberry_Pi&quot;&gt;Raspberry Pi’s&lt;/a&gt;, a credit-card-sized single-board computer.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a name=&quot;2013&quot;/&gt;2013: The Univalent Foundations Program, Institute for Advanced Study organizes 40 authors to release &lt;a href=&quot;http://homotopytypetheory.org/2013/06/20/the-hott-book/&quot;&gt;The HoTT Book&lt;/a&gt; on &lt;a href=&quot;http://homotopytypetheory.org/&quot;&gt;Homotopy Type Theory&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;If you made it this far you’ve survived my brief, relatively speaking, trip though five millennia of the human history of computing.  It was hard to pick more recent things since we don’t know what the important events for the future are.  I chose to end with Homototpy Type Theory since it is supposed to be the next big thing.  Also you might have noticed that my title is similar, perhaps an homage, or just a rip off of:  &quot;&lt;a href=&quot;http://james-iry.blogspot.com/2009/05/brief-incomplete-and-mostly-wrong.html&quot;&gt;A Brief, Incomplete, and Mostly Wrong History of Programming Languages&lt;/a&gt;&quot;.  I had this idea prior to seeing his and for a long time it deterred me from writing this, but I finally got over the perception that he did it first since my original idea was quite different.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;If you are still hungry for more including various references and influences on this post:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://mason.gmu.edu/~montecin/computer-hist-web.htm&quot;&gt;History of Computing&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Columbia University &lt;a href=&quot;http://www.columbia.edu/cu/computinghistory/&quot;&gt;Computing History&lt;/a&gt;&lt;/p&gt;&lt;p&gt;List of &lt;a href=&quot;http://www.ieeeghn.org/wiki/index.php/Milestones:List_of_IEEE_Milestones&quot;&gt;IEEE Milestones&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://ieeeghn.org/wiki/index.php/History_of_Lossless_Data_Compression_Algorithms&quot;&gt;History of Lossless Data Compression Algorithms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.linuxvoice.com/john-von-neumann/&quot;&gt;John von Neumann, EDVAC, and the IAS machine&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Computer History Museum &lt;a href=&quot;http://www.computerhistory.org/timeline/&quot;&gt;Timeline of Computer History&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Wikipedia &lt;a href=&quot;http://en.wikipedia.org/wiki/History_of_computing&quot;&gt;History of Computing&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Wikipedia &lt;a href=&quot;http://en.wikipedia.org/wiki/Timeline_of_computing&quot;&gt;Timeline of Computing&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PBS American Experience: &lt;a href=&quot;http://www.pbs.org/wgbh/americanexperience/films/silicon/&quot;&gt;Silicon Valley&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PBS Nova’s &lt;a href=&quot;http://www.pbs.org/wgbh/nova/decoding/&quot;&gt;Decoding Nazi Secrets&lt;/a&gt;&lt;/p&gt;&lt;p&gt;James Burke’s &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Day_the_Universe_Changed&quot;&gt;The Day the Universe Changed&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://www.elegantcoding.com/2014/08/a-brief-and-incomplete-history-of.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ1cAUGYPeOF0u_XLd66L3Z73jxY-TRYOjUhmlUdEYCsiKsMjSOCclBMDfPrnpi7B-F7t4KwwlSlm3liqI7NZjs5II296pQb_y8gSFX-LIx-Yyhea1BTIq5hR7iXhfk-fD_wjqkV74rMCn/s72-c/cloud-comp.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-7312357019679555782</guid><pubDate>Wed, 23 Jul 2014 23:32:00 +0000</pubDate><atom:updated>2014-08-03T15:36:30.988-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Graph Theory</category><title>A Survey of Graph Theory and Applications in Neo4J</title><description>&lt;div&gt;&lt;!--A Survey of Graph Theory and Applications in Neo4J--&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDoWcxYMEXv8EsYt_B3rpm1QKLLMTxvaFRDOx6W6TPB6YB3OWrCUr8IJbCXW5pRKA_n51TQKZl1QBsIEeNiWzOADzZvI-a8x5OGlDYGY5Y2bLU1KWIrkUwCKX8uILYMWJ3tl6ODBwVuw4G/s1600/Greta_oto.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDoWcxYMEXv8EsYt_B3rpm1QKLLMTxvaFRDOx6W6TPB6YB3OWrCUr8IJbCXW5pRKA_n51TQKZl1QBsIEeNiWzOADzZvI-a8x5OGlDYGY5Y2bLU1KWIrkUwCKX8uILYMWJ3tl6ODBwVuw4G/s400/Greta_oto.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;A while ago I had the idea to do a graph theory talk at our local Neo4J Meetup, the &lt;a href=&quot;http://www.meetup.com/graphdb-baltimore/&quot;&gt;Baltimore Washington Graph Database Meetup&lt;/a&gt;, especially since Neo4J and graph databases are based on graph theory.  So I finally sat down and spent quite a bit of time putting a talk together. I decided to go with the idea of an overview of graph theory with a primary focus on the theoretical aspects and with some applications like network theory and some specific examples of applications to Neo4J.  My talk is titled: &quot;A Survey of Graph Theory and Applications in Neo4J&quot; and I presented it on June 24, see below for &lt;a href=&quot;#videos&quot;&gt;video&lt;/a&gt;, &lt;a href=&quot;https://github.com/elegantcoding/NeoGraphTheory&quot;&gt;slides&lt;/a&gt;, and &lt;a href=&quot;#references&quot;&gt;references&lt;/a&gt;. This post is my thoughts on it and things leading up to its creation.&lt;/p&gt;&lt;p&gt;Some of my blog posts are created from a desire to make math more accessible and more relevant especially those areas of math that seem to be neglected by the traditional educational system.  One huge gaping hole in my math education both in our American institutional learning facilities and in my college computer science curriculum was that I was never exposed to graph theory.   Once you start studying graph theory you realize that many of these concepts could be taught in middle and elementary schools.  As I was preparing my presentation, I saw this: &quot;&lt;a href=&quot;http://jdh.hamkins.org/math-for-seven-year-olds-graph-coloring-chromatic-numbers-eulerian-paths/&quot;&gt;Math for seven-year-olds: graph coloring, chromatic numbers, and Eulerian paths and circuits&lt;/a&gt;&quot;, reaffirming what I already knew.  Sadly many of these concepts were new to me as an adult, and I’d guess the same was probably true of much of my audience.  &lt;/p&gt;&lt;p&gt;Graph theory has been a topic that I have included in my blog, I have written two posts about it one is a general math post: &quot;&lt;a href=&quot;http://www.elegantcoding.com/2011/07/triangles-triangular-numbers-and.html&quot;&gt;Triangles, Triangular Numbers, and the Adjacency Matrix&lt;/a&gt;&quot; and the other post: &quot;&lt;a href=&quot;http://www.elegantcoding.com/2011/08/object-graph.html&quot;&gt;The Object Graph&lt;/a&gt;&quot; attempts to put it in part in a programming context .  One post or series of posts that I have wanted to do is an introduction/overview of graph theory.  I was thinking that my talk could be turned into those posts.  However, I am not sure if and when I will get a chance to do that, so I figured until then I will make the talk itself that post and that post is this post.&lt;/p&gt;&lt;p&gt;I found myself torn about publishing the video of my presentation, on one hand I feel that it could be much better but on the other, as a friend pointed out, people might find it informative and enjoy watching it.  That being said, I reserve the right to replace it with a better version if I ever do one.&lt;/p&gt;&lt;p&gt;Writing a post about the talk provides me with an opportunity make a few corrections, add some more source material and mention a couple of things that I would have liked to include but that got cut in the interest of time.&lt;/p&gt;&lt;p&gt;I’ll start by adding some additional source material.  I followed the introductory remarks with a brief historical overview.  For that, especially 20&lt;sup&gt;th&lt;/sup&gt; century contributors I made use these &lt;a href=&quot;www.cl.cam.ac.uk/teaching/1314/PrincComm/slides/graph_theory.ppt&quot;&gt;power point slides&lt;/a&gt; of John Crowcroft’s &quot;Principles of Communications&quot; course.  I also referenced &lt;u&gt;&lt;a href=&quot;http://www.maa.org/publications/maa-reviews/graph-theory-1736-1936&quot;&gt;Graph Theory, 1736-1936&lt;/a&gt;&lt;/u&gt; by Norman L. Biggs, E. Keith Lloyd, and Robin J. Wilson.  I mentioned the &lt;a href=&quot;http://en.wikipedia.org/wiki/Watts_and_Strogatz_model&quot;&gt;Watts and Strogatz Model&lt;/a&gt; (&lt;a href=&quot;labs.yahoo.com/files/w_s_NATURE_0.pdf&quot;&gt;pdf&lt;/a&gt; of original nature paper).  I also included &lt;a href=&quot;http://math.ucsd.edu/~fan/&quot;&gt;Fan Chung&lt;/a&gt; who is married to &lt;a href=&quot;http://en.wikipedia.org/wiki/Ronald_Graham&quot;&gt;Ronald Graham&lt;/a&gt; and is known for her work in graph theory especially &lt;a href=&quot;http://en.wikipedia.org/wiki/Spectral_graph_theory&quot;&gt;spectral graph theory&lt;/a&gt;.   I mentioned &lt;a href=&quot;http://en.wikipedia.org/wiki/Snark_%28graph_theory%29&quot;&gt;snarks&lt;/a&gt; not to be confused with Lewis Carroll‘s &lt;a href=&quot;http://en.wikipedia.org/wiki/Snark_%28Lewis_Carroll%29&quot;&gt;snarks&lt;/a&gt; from which he coined the name.  When I was talking about the topology part I mentioned &lt;a href=&quot;http://www.eulersgem.com/&quot;&gt;Eulers Gem&lt;/a&gt;.  Since the World Cup was going on during the talk I have to include these topology links &quot;&lt;a href=&quot;http://cs.brown.edu/courses/csci1950-h/soccerball_topology.pdf&quot;&gt;The Topology and Combinatorics of Soccer Balls(pdf)&lt;/a&gt;&quot; and some more &quot;&lt;a href=&quot;http://arxiv.org/abs/1406.7058&quot;&gt;soccer ball math&lt;/a&gt;&quot;.&lt;/p&gt;&lt;p&gt;Due to time constraints I cut a few topics,  two of them were the ideas of &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_isomorphism&quot;&gt;graph isomorphisms&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_automorphism&quot;&gt;graph automorphisms&lt;/a&gt;, also ideas like: Graph families defined by their &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_automorphism#Graph_families_defined_by_their_automorphisms&quot;&gt;automorphisms&lt;/a&gt; and the &lt;a href=&quot;http://en.wikipedia.org/wiki/Automorphism_group#Automorphism_group&quot;&gt;automorphism group&lt;/a&gt;.  Another area that I didn’t really get into, except the linear algebra parts was the area of &lt;a href=&quot;http://en.wikipedia.org/wiki/Algebraic_graph_theory&quot;&gt;algebraic graph theory&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I did want to offer up a couple of corrections: I called a &lt;a href=&quot;http://en.wikipedia.org/wiki/Truncated_icosahedron&quot;&gt;truncated icosahedron&lt;/a&gt; a dodecahedron, how embarrassing. I called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Travelling_salesman_problem&quot;&gt;Travelling Salesman Problem&lt;/a&gt;, the Travelling Salesman Program, doh! When I said a bipartite graph has no connections between edges, it should have been vertices.  And finally I misstated &lt;a href=&quot;http://en.wikipedia.org/wiki/Kirchhoff&#39;s_theorem&quot;&gt;Kirchoff’s Theorem&lt;/a&gt;, it should be n-1 &lt;b&gt;non-zero&lt;/b&gt; Eigenvalues, obviously you only use the non-zero ones!  There are probably more and if I decide to replace these videos in the future, I will just replace this paragraph as well.&lt;/p&gt;&lt;p&gt;On a lighter note, when I was creating my &quot;Graphs are Everywhere&quot; images and sharing with my friend Wes, I created this one for fun:&lt;/p&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigZP7hY21tg70hyaByjKIA7GYea_YaRM0EmrVPFbdbkmKDMgl7sL3uRwb-W9Vu6SnTPy8fEBuAboU_AFJRS14T7BP2qtuajtgzc0LNsZ-55VwV2kMO3H98tuK19bS9vDiFWCbyZUh4sucW/s1600/ecce.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigZP7hY21tg70hyaByjKIA7GYea_YaRM0EmrVPFbdbkmKDMgl7sL3uRwb-W9Vu6SnTPy8fEBuAboU_AFJRS14T7BP2qtuajtgzc0LNsZ-55VwV2kMO3H98tuK19bS9vDiFWCbyZUh4sucW/s200/ecce.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Finally I’d like to thank our meetup sponsor &lt;a href=&quot;http://www.neotechnology.com/&quot;&gt;neotechnology&lt;/a&gt; refreshments.  The part where we thanked them at the meetup didn’t get recorded.&lt;/p&gt;&lt;a name=&quot;videos&quot;/&gt;&lt;br /&gt;
&lt;h3&gt;Videos&lt;/h3&gt;&lt;br /&gt;
&lt;h4&gt;Part 1&lt;/h4&gt;&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;270&quot; src=&quot;//www.youtube.com/embed/FUpfi5jV3f4&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;Part 2&lt;/h4&gt;&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;270&quot; src=&quot;//www.youtube.com/embed/iulkbBrnRJg&quot; width=&quot;480&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&quot;references&quot;/&gt;&lt;br /&gt;
&lt;h3&gt;References and Further Reading&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://diestel-graph-theory.com/&quot;&gt;Reinhard Diestel - Graph Theory&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wiktionary.org/wiki/Appendix:Glossary_of_graph_theory&quot;&gt;Wikipedia: Glossary of Graph Theory&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://math.tut.fi/~ruohonen/GT_English.pdf&quot;&gt;GRAPH THEORY - Keijo Ruohonen (pdf)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.columbia.edu/~cs6204/course%20material.html&quot;&gt;Topics in Graph Theory (COMS 6204) - SPRING 2010&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cs.cornell.edu/home/kleinber/networks-book/&quot;&gt;Networks, Crowds, and Markets&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.springer.com/computer/theoretical+computer+science/book/978-3-540-24979-5&quot;&gt;Network Analysis: Methodological Foundations Ulrik Brandes, Thomas Erlebach&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Category:Graph_algorithms&quot;&gt;Wikipedia: Graph algorithms&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://theory.stanford.edu/~virgi/cs267/&quot;&gt;CS267 Graph Algorithms Winter 2014&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://www.elegantcoding.com/2014/07/a-survey-of-graph-theory-and.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDoWcxYMEXv8EsYt_B3rpm1QKLLMTxvaFRDOx6W6TPB6YB3OWrCUr8IJbCXW5pRKA_n51TQKZl1QBsIEeNiWzOADzZvI-a8x5OGlDYGY5Y2bLU1KWIrkUwCKX8uILYMWJ3tl6ODBwVuw4G/s72-c/Greta_oto.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-3762853075197693385</guid><pubDate>Sat, 15 Mar 2014 15:10:00 +0000</pubDate><atom:updated>2014-03-15T11:10:57.337-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Rant</category><category domain="http://www.blogger.com/atom/ns#">Software Development Teams</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><title>Are Your Developers Treating Your Project as Their Own Personal Science Project?</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8tBp4-Lw4wPW7cVjjgC91eoXzB4QoAZrVewUCvqarq1ixKWmc4UTLvj1bQZcCvuR1lo6MHksS5-GplWCsuVWfqqotxmmrQ7KzAxgpYN_IFFBGUrgjWtWYfmrqcb3kYMijU6R6kpwAR_PX/s1600/ad.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8tBp4-Lw4wPW7cVjjgC91eoXzB4QoAZrVewUCvqarq1ixKWmc4UTLvj1bQZcCvuR1lo6MHksS5-GplWCsuVWfqqotxmmrQ7KzAxgpYN_IFFBGUrgjWtWYfmrqcb3kYMijU6R6kpwAR_PX/s400/ad.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!-- Are Your Developers Treating Your Project as Their Own Personal Science Project?--&gt;&lt;br /&gt;
&lt;div&gt;&lt;p&gt;Years ago I worked on a project that had a custom role based security system and for this system we needed a way to load menus according to the users’ assigned roles.  Two of the dominant developers on the project decided that this was a perfect use for AJAX mainly because they wanted to learn and use AJAX.  So they build a separate deployable menu application to serve up the menu by emitting XML from a Spring Controller URL, it was very comparable to a simple Restful service. It was called directly from JavaScript in the application’s web page.  Since there would be a lot of calls for any given user’s menu they built a cache for each user’s menu options, it was a custom cache where objects never expired.  This work was completed as I joined the project and as I got acquainted with this project my first thought was why do all this work?  Why not just load the menu when the user is authenticated and then cache it into the HTTP Session, I raised the issue but was ignored.  It was their pet project and it was sacrosanct.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Later, while testing the apps that used the AJAX menu call the testers ran into a problem, the cache was interfering with testing because it was keeping the database changes from be propagated and testing the applications created a need to continuously restart the AJAX menu app.  So a new admin interface was added to the AJAX menu application to allow the testers to clear the cache.  This created a whole separate application that the client would have to support just to enable this unnecessary AJAX menu delivery mechanism.  So instead of just caching the data in the HTTP Session which is easier and any cache problem would be fixed by just logging out and logging back in, these two developers built a pet project which  consists of an extra application and codebase that has to be understood and maintained.  Ultimately the biggest problem this creates boils down to simple economics, it more expensive to maintain a solution that requires a whole separate application.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I think there is a tendency for all developers both good and bad to sometimes want to make projects more interesting and there can be a lot of temptations.  It is often tempting to create a custom implementation of something that could be found already written because it’s a fun project or the temptation to shoehorn a new hot technology into a project or even the temptation to add a solution to a problem that doesn’t need to be solved or just strait up over engineering.    I am guilty of some of these transgressions myself over the years.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;My anecdote about the menu app is just one of at least a dozen of egregious examples of these types of software project blunders that I have seen over the years.  My anecdote shows a manifestation of this problem and it also shows that these types of software project issues have a real tangible cost.  They create more code and often more complex code.  In some cases they create the need for specialized technical knowledge that wasn’t even necessary for the project.  While these approaches may only result in a small cost increases during the construction of the software the real consequence will be the long term maintenance costs of a software system that was needlessly overcomplicated.   In some cases these costs will be staffing costs but they can also be time costs in that changes and maintenance take considerably longer.  These problems may also result in costs to business as unwieldy systems cause the loss of customers to competitors and can impede the ability to gain new customers. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;These types of decisions can be viewed as software project blunders.  In some cases the developers know better but choose to be selfish in that they put their own desires above the project, in these cases these decisions can potentially be viewed as unethical.  The two developers from the anecdote were extreme examples and were pushing into unethical territory since they treated every new project as a personal opportunity to use some new technique or library or some custom idea that they were interested in.  However, I think most of these blunders are simply that, mistakes in judgment or lack of good oversight.  It is always easier in hindsight to see these problems, but when one is in the heat of the moment on the project one can lose perspective.  The real challenge is trying to avoid these blunders. Really these are problems that fall into a larger spectrum of software project management problems and sadly I have mostly seen terrible software project management throughout my career.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I wish I could say I have a solution to this problem.  I think developers have some responsibility here especially senior developers, well at least the good ones.  Software development is really about decisions.  Developers make many decisions every day including naming, project structure, tools, libraries, frameworks, languages, etc.  Too often these decisions are made in isolation without any review and sometimes they can have serious long term consequences.  When making so many decisions in such a complex domain mistakes are inevitable.  Good software developers and good teams make an effort to deliberate and review their choices.&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://www.elegantcoding.com/2014/03/are-your-developers-treating-your.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8tBp4-Lw4wPW7cVjjgC91eoXzB4QoAZrVewUCvqarq1ixKWmc4UTLvj1bQZcCvuR1lo6MHksS5-GplWCsuVWfqqotxmmrQ7KzAxgpYN_IFFBGUrgjWtWYfmrqcb3kYMijU6R6kpwAR_PX/s72-c/ad.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-5755942323344096130</guid><pubDate>Wed, 11 Dec 2013 17:34:00 +0000</pubDate><atom:updated>2013-12-11T15:01:25.671-05:00</atom:updated><title>Haskell DC</title><description>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg39HXXacXYr2ipXW7uYaDjvpoPBAyfCJ_9bMqt0rtK6DGnK1xwrf03DG-8Kvr29XPq92YRa_UnlaZc0CZOp3m7IwFYAgeLTZIPxObU-jyIIiZ9wColuTjhlRj8pgzYplwsoSpjlH5ncLEH/s1600/haskell.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg39HXXacXYr2ipXW7uYaDjvpoPBAyfCJ_9bMqt0rtK6DGnK1xwrf03DG-8Kvr29XPq92YRa_UnlaZc0CZOp3m7IwFYAgeLTZIPxObU-jyIIiZ9wColuTjhlRj8pgzYplwsoSpjlH5ncLEH/s400/haskell.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

&lt;/style&gt;&lt;!--Haskell DC--&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=Section1&gt;&lt;br /&gt;
&lt;p&gt;I am proud and excited to announce the meetup group &lt;a href=&quot;http://www.meetup.com/Haskell-DC/&quot;&gt;Haskell DC&lt;/a&gt;.  Our first meetup agenda is open so I envision some discussion and maybe some basic hacking perhaps using &lt;a href=&quot;http://book.realworldhaskell.org/&quot;&gt;Real World Haskell&lt;/a&gt; or &lt;a href=&quot;http://learnyouahaskell.com/&quot;&gt;Learn You a Haskell for Greater Good&lt;/a&gt;.  Both are freely available online.  In this post I will put forth some ideas that we might consider for future meetups.  I hope to see this grow into a community and am looking forward to contributions from members especially those that are currently working with Haskell.  I hope to see a mix of practical and theoretical discussions and topics. I will also try to grow the group in terms of sponsorship.  We actually have our first sponsor, the local coworking space company &lt;a href=&quot;http://uberoffices.com/&quot;&gt;Uberoffices&lt;/a&gt; is providing us space for our meetups.  I recently added our meetup to &lt;a href=&quot;haskell.org&quot;&gt;haskell.org&lt;/a&gt; under &lt;a href=&quot;http://www.haskell.org/haskellwiki/User_groups#East_Coast&quot;&gt;East Coast&lt;/a&gt;, which makes it seem a little more official.  I have setup social media accounts on Twitter &lt;a href=&quot;https://twitter.com/HaskellDC&quot;&gt;@HaskellDC&lt;/a&gt; also use #HaskellDC for HaskellDC tweets.  I created a &lt;a href=&quot;https://plus.google.com/u/0/108495772422786420157/posts&quot;&gt;Google Plus account&lt;/a&gt; with the email haskelldc0 at gmail,  haskelldc was taken. I have also created a Community in Google Plus for &lt;a href=&quot;https://plus.google.com/communities/102207275806545217012?hl=en&quot;&gt;HaskellDC&lt;/a&gt;. I hope to do a Google Hangout for our meetups which was requested by one of our remote members.  I even created a &lt;a href=&quot;https://www.facebook.com/haskell.dc&quot;&gt;Facebook account&lt;/a&gt; if for no other reason but to claim it.  I admit to not being great at the social media stuff but will do my best or perhaps I will get help there from other members.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Learning Haskell has been on my list of things that I want to do for quite a while.  Haskell is attractive to me because it was developed in academia and embodies some mathematical concepts and now it seems to be gaining ground for commercial use.  So it is interesting to both the computer scientist and the working programmer.  I have a few ideas about future meetup topics both practical and theoretical that I wanted to list out in this post. Of course the future is wide open and I am hoping that as a group we develop future ideas with opportunities for anyone to present or lead a coding session.  In researching this post I became overwhelmed by the copious amount of material that there is out there for Haskell.  I plan to write at least one if not two more posts about Haskell in terms of resources, research, and the ecosystem.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The following are some lists of Programming Language Features, Software Development Related Topics, Practical applications, Advanced Programming Areas and Theoretical Topics. This list is derived from areas of my own interests along with areas that I feel are useful to practical software development.  I put these forth as possible topics for consideration for future meetups:&lt;/p&gt;&lt;br /&gt;
&lt;h2&gt;Haskell Language&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;   &lt;li&gt;Functional Programming, &lt;a href=&quot;http://en.wikipedia.org/wiki/Purely_functional&quot;&gt;Purely Functional&lt;/a&gt; Programming&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Immutable&quot;&gt;Immutability&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Lazy_evaluation&quot;&gt;Lazy Evaluation&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Type_system&quot;&gt;Type System&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Type_inference&quot;&gt;Type inference&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Pattern_matching&quot;&gt;Pattern Matching&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Algebraic_data_type&quot;&gt;Algebraic Data types&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/List_comprehension&quot;&gt;List Comprehensions&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Fold_%28higher-order_function%29&quot;&gt;Folds&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Monad_%28functional_programming%29&quot;&gt;Monads&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Type_class&quot;&gt;Type Classes&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Type_polymorphism&quot;&gt;Type Polymorphism&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://www.haskell.org/haskellwiki/Kinds&quot;&gt;Kind&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://www.haskell.org/haskellwiki/GHC/Memory_Management&quot;&gt;Memory Footprint and Garbage Collection&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Ecosystem&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;   &lt;li&gt;IDE Support&lt;/li&gt;
   &lt;li&gt;Building and Deploying, Production deployment&lt;/li&gt;
   &lt;li&gt;Continuous Integration&lt;/li&gt;
   &lt;li&gt;Package Management&lt;/li&gt;
   &lt;li&gt;Testing&lt;/li&gt;
   &lt;li&gt;Implementations, &lt;a href=&quot;http://www.haskell.org/ghc/&quot;&gt;GHC&lt;/a&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Practical Uses&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;   &lt;li&gt;Web Development&lt;/li&gt;
   &lt;li&gt;XML, HTML Processing and parsing&lt;/li&gt;
   &lt;li&gt;Network Client/Server, Web Services, Restful, JSON, SOAP&lt;/li&gt;
   &lt;li&gt;Desktop GUI&lt;/li&gt;
   &lt;li&gt;Graphics support&lt;/li&gt;
   &lt;li&gt;Embedded programming&lt;/li&gt;
   &lt;li&gt;Relational Database Access&lt;/li&gt;
   &lt;li&gt;MongoDB&lt;/li&gt;
   &lt;li&gt;Neo4j&lt;/li&gt;
   &lt;li&gt;Hadoop/HBase&lt;/li&gt;
   &lt;li&gt;Lucene, Elastic Search, Solr&lt;/li&gt;
   &lt;li&gt;Other NoSQL: Casandra, CouchDB, Riak, etc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Advanced Topics and Uses&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;   &lt;li&gt;Algorithms&lt;/li&gt;
   &lt;li&gt;Generic Programming&lt;/li&gt;
   &lt;li&gt;Parsers, &lt;a href=&quot;http://en.wikipedia.org/wiki/Parser_combinator&quot;&gt;Parser combinators&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Parsing_expression_grammar&quot;&gt;PEGs&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;Natural Language Processing&lt;/li&gt;
   &lt;li&gt;Graph Theory Applications, Graph Algorithms, &lt;a href=&quot;http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm&quot;&gt;Dijkstra&#39;s Algorithm&lt;/a&gt;, etc.&lt;/li&gt;
   &lt;li&gt;Algebraic programming e.g. &lt;a href=&quot;https://github.com/non/spire&quot;&gt;Scala’s Spire Library&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;Data Munging, Data Science, Data Visualization&lt;/li&gt;
   &lt;li&gt;Statistical and Mathematical Programming&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Theoretical&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Lambda_calculus&quot;&gt;Lambda Calculus&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Strongly_typed_programming_language&quot;&gt;Strong vs. Weak Typing&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Type_theory&quot;&gt;Type Theory&lt;/a&gt;, &lt;a href=&quot;http://homotopytypetheory.org/&quot;&gt;Homotopy Type Theory&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system&quot;&gt;Hindley–Milner type system&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Category_Theory&quot;&gt;Category Theory&lt;/a&gt;, &lt;a href=&quot;http://learnyouahaskell.com/functors-applicative-functors-and-monoids&quot;&gt;Functors&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Monad_%28category_theory%29&quot;&gt;Monads&lt;/a&gt;, &lt;a href=&quot;http://ulissesaraujo.wordpress.com/2007/12/19/catamorphisms-in-haskell/&quot;&gt;Catamorphisms&lt;/a&gt;, &lt;a href=&quot;http://ulissesaraujo.wordpress.com/2009/04/08/anamorphisms-in-haskell/&quot;&gt;Anamorphism&lt;/a&gt;, etc.&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/basic-lensing&quot;&gt;Lenses&lt;/a&gt;, &lt;a href=&quot;http://www.haskellforall.com/2013/02/you-could-have-invented-comonads.html&quot;&gt;Comonads&lt;/a&gt;, &lt;a href=&quot;http://haskellformaths.blogspot.com/2011/04/what-is-coalgebra.html&quot;&gt;Coalgebras&lt;/a&gt;, &lt;a href=&quot;http://blog.sigfpe.com/2006/06/monads-kleisli-arrows-comonads-and.html&quot;&gt;Kleisli Arrows&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Interesting (Haskell Related) Publications&lt;/h2&gt;&lt;br /&gt;
&lt;ul&gt;   &lt;li&gt;&lt;a href=&quot;http://http://lcsd05.cs.tamu.edu/papers/dos_reis_et_al.pdf&quot;&gt;What is Generic Programming? - Library-Centric Software Design&lt;/a&gt; by Gabriel Dos Reis and Jaakko Jarvi&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://www.cs.ox.ac.uk/jeremy.gibbons/publications/iterator.pdf&quot;&gt;The Essence of the Iterator Pattern&lt;/a&gt; by Jeremy Gibbons&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://www.cs.ox.ac.uk/jeremy.gibbons/publications/origami.pdf&quot;&gt;Origami programming&lt;/a&gt; by Jeremy Gibbons&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://www.haskell.org/wikiupload/e/e9/Typeclassopedia.pdf&quot;&gt;Typeclassopedia&lt;/a&gt; Issue 13 of &lt;a href=&quot;http://www.haskell.org/haskellwiki/The_Monad.Reader&quot;&gt;The Monad Reader&lt;/a&gt; by Brent Yorgey&lt;/li&gt;
   &lt;li&gt;&lt;a href=&quot;http://www.cs.cmu.edu/%7Erwh/theses/okasaki.pdf&quot;&gt;Purely Functional Data Structures&lt;/a&gt; by Chris Okasaki&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Ok, that’s quite a list. I tried to categorize these as best as I could. Monads show up under theory and language features, although I am not sure but I think they may be considered more of a language idiom.  The list is clearly ambitious.  If we have one meetup per month it would probably take several years to cover all of these topics if that were the plan.  As some of the theoretical topics are pretty advanced, and I hope to someday understand them.  Hopefully as a group maybe we make some progress as the theoretical aspects are important for better application of the practical.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I have heard many positive things said about Haskell in regards to good software development practices and that it facilitates the creation of better quality software which is what I, and most likely all good software developers, are striving for.   One topic that is of great interest to me is software reuse, I have written about it in relation to &lt;a href=&quot;http://www.elegantcoding.com/2012/02/software-reuse-complexity-curve.html&quot;&gt;complexity&lt;/a&gt; and &lt;a href=&quot;http://www.elegantcoding.com/2012/04/what-is-generic-programming.html&quot;&gt;generic programming&lt;/a&gt;.  The generic programming post takes its title from a paper of the same name, listed above as a Haskell related paper.  Interestingly &lt;a href=&quot;https://github.com/ekmett&quot;&gt;Edward Kmett&lt;/a&gt; &lt;a href=&quot;http://www.youtube.com/watch?v=6GNDzrgFhGM&quot;&gt;mentions&lt;/a&gt; in his &lt;a href=&quot;http://www.youtube.com/user/haskellcast&quot;&gt;Haskellcast&lt;/a&gt; about his &lt;a href=&quot;https://github.com/ekmett/lens&quot;&gt;Lens Library&lt;/a&gt; that using Haskell facilitates a higher ease of reuse that would require significant discipline, especially for a team, when using an OO language like C++.  Another area is that of testing, while I think testing is important, my experience with TDD is limited, but it seems that TDD increases the amount of code that has to be written and understood.  I have read that Haskell’s type system, like any statically typed language, allows for less testing because of static type checking.  This rings true to me as dynamically typed languages like Python, Javascript, and Ruby need tests to enforce things that a type system would give you. Also, &lt;a href=&quot;http://en.wikipedia.org/wiki/Pure_function&quot;&gt;purity&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Referential_transparency_(computer_science)&quot;&gt;referential transparency&lt;/a&gt; eliminate side effects. State still exists but it is managed more cleanly.  Haskell’s concise syntax is another potential benefit which allows more complexity to be expressed and read more easily.  Powerful features like list comprehensions, pattern matching, and abstract datatypes (ADTs) allow for smaller idiomatic code.  Of course this requires programmers that understand all of this.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;CS research publications are a primary area of interest for me and I have encountered many that use and mention Haskell.  The list above provides some papers covering some fairly pragmatic topics that should be of interest to working programmers like Generic Programming, Design Patterns, and Data Structures.     I also include Brent Yorgey’s Typeclassopedia which gets a lot of mentions from people giving advice about learning Haskell and starts with the following advice:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt; “The standard Haskell libraries feature a number of type classes with algebraic or category-theoretic underpinnings. Becoming a fluent Haskell hacker requires intimate familiarity with them all, yet acquiring this familiarity often involves combing through a mountain of tutorials, blog posts, mailing list archives, and IRC logs. The goal of this article is to serve as a starting point for the student of Haskell wishing to gain a firm grasp of its standard type classes. The essentials of each type class are introduced, with examples, commentary, and extensive references for further reading.&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;In the course of my own general research and what I did for this post, I can attest to the large amount and overwhelming Haskell related topics both theoretical and practical that are available online. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In my above list of possible theoretical interests to the meetup group, I list Homotopy Type Theory.  The relevance here is of course that Type Theory is relevant to Haskell.  The theory and the book are new, coming out this year.  I wanted to give it special mention because there is a lot of excitement about it, including claims that the theory is potentially revolutionary to both mathematics and computer science.  The book is a daunting 600 pages and very heavy going, however, &lt;a href=&quot;http://existentialtype.wordpress.com/&quot;&gt;Robert Harper&lt;/a&gt; has done a series of &lt;a href=&quot;http://existentialtype.wordpress.com/2013/12/04/homotopy-type-theory-lectures-and-notes-on-line/&quot;&gt;lectures&lt;/a&gt;.  I have watched the first lecture and found it very enlightening so I would recommend it, so far anyway.     &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So for the meetup, as I mentioned we will probably start off with some easy learning and hacking. I thought it might be fun to try to implement something simple, maybe &lt;a href=&quot;http://en.wikipedia.org/wiki/Fizz_buzz&quot;&gt;Fizz Buzz&lt;/a&gt;.  Ultimately it would be nice to work to get set up with the ecosystem to do productive things in Haskell. Maybe eventually a group project or some higher level hacking, I have thought it might be interesting to something like work though some of the problems in &lt;a href=&quot;http://www.greenteapress.com/thinkstats/&quot;&gt;Think Stats&lt;/a&gt; possibly using a &lt;a href=&quot;http://hackage.haskell.org/package/statistics&quot;&gt;Haskell statistics package&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Well those are my ideas, feel free to suggest others or correct me if I got anything wrong, this is all new to me.&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://www.elegantcoding.com/2013/12/haskell-dc.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg39HXXacXYr2ipXW7uYaDjvpoPBAyfCJ_9bMqt0rtK6DGnK1xwrf03DG-8Kvr29XPq92YRa_UnlaZc0CZOp3m7IwFYAgeLTZIPxObU-jyIIiZ9wColuTjhlRj8pgzYplwsoSpjlH5ncLEH/s72-c/haskell.jpg" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-6203044671557686484</guid><pubDate>Mon, 11 Mar 2013 11:30:00 +0000</pubDate><atom:updated>2013-03-29T12:03:30.279-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Lattice Theory</category><category domain="http://www.blogger.com/atom/ns#">Order Theory</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">Set Theory</category><title>Programming and Order Theory</title><description>&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

div.source-code {
    font-family       : &quot;Courier New&quot;;
    color             : black;
    background-color  : #eee;
    font-size         : 12px;
    font-size         : 10.0pt;
    border            : 1px dashed #999999;
    line-height       : 14px;
    padding           : 5px;
    overflow          : auto;
    width             : 100%;
    text-indent       : 0px;
    margin-top        : 8px;
    margin-bottom     : 8px;
}

span.key-word {
    font-size   :   10.0pt;
    font-family :   &quot;Courier New&quot;;
    color       :   #7F0055;
    font-weight :   bold;
}

p.codeline {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    color:black;
}

p.codeline1 {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    text-indent:.5in;
}

p.codeline2 {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    text-indent:1in;
}

p.codeline3 {

    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    text-indent:1.5in;
}
&lt;/style&gt;&lt;!--Programming and Order Theory--&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdOdS69ETQ4lKYnnD_t2cSTqZSYGX9evnOxACsyyMYdyIcnqViCx0a6cJsEw-D1xY3hDetNRcmX21KESgi0kv2vHpdZMuK6r8AzNSrcJjMsCARB5LX9ywFFyhCoZ3jsgmlZFJkgbsUgwua/s1600/swtail.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdOdS69ETQ4lKYnnD_t2cSTqZSYGX9evnOxACsyyMYdyIcnqViCx0a6cJsEw-D1xY3hDetNRcmX21KESgi0kv2vHpdZMuK6r8AzNSrcJjMsCARB5LX9ywFFyhCoZ3jsgmlZFJkgbsUgwua/s320/swtail.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Covariance, Contravariance and Order Theory&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;In this post I make the observation that covariance and contravariance in programming are what are known as &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html#Order_Duality&quot;&gt;Order Duals&lt;/a&gt;.  I am not the first person to make this observation, however, these ideas often tend to be buried in academic research papers like &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.33.1539&quot;&gt;Adding Axioms to Cardelli-Wegner Subtyping&lt;/a&gt;&quot;  by Anthony J H Simons, don’t get me wrong I love these types of papers, they give me hope and inspiration that software engineering will someday become a first class engineering citizen.  Unfortunately, these types of papers tend to be too theoretical and thus not very accessible for the average developer.  This is unfortunate as the idea of covariance and contravariance as order duals both puts these concepts into the mathematical context of order theory and possibly gives programmers some native context for order theory.  So hopefully this post will make these ideas more programmer friendly.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I previously wrote a post about &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html&quot;&gt;lattice theory&lt;/a&gt;, which is part of the more general order theory, where I talked about some basic order theory ideas such as &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html#Order_Duality&quot;&gt;duality&lt;/a&gt;.   Order theory occurs quite a lot in software and programming and this is part of a series of posts to talk about those occurrences.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Covariance and contravariance receive a fair amount of attention, as they should, in software blogs and some of these posts include some interesting observations. One, perhaps slightly off topic observation, is &quot;&lt;a href=&quot;http://apocalisp.wordpress.com/2010/10/06/liskov-substitution-principle-is-contravariance/&quot;&gt;Liskov Substitution Principle is Contravariance&lt;/a&gt;&quot; which is an interesting observation and interesting post if you overlook the disdainful tone towards OO.  Another more relevant post which is a nice post about &quot;&lt;a href=&quot;http://blogs.atlassian.com/2013/01/covariance-and-contravariance-in-scala/&quot;&gt;Covariance and Contravaiance in Scala&lt;/a&gt;&quot; relates these ideas to category theory which is relevant especially since apparently you can think of &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.40.7855&quot;&gt;Category Theory as Coherently Constructive Lattice Theory&lt;/a&gt;&quot;, warning heavy going in that paper.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Defining Covariance and Contravariance&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;To me one of the most striking and perhaps apropos examples of order theory in software is that of covariance and contravariance which Eric Lippert defines on his &lt;a href=&quot;http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx&quot;&gt;blog&lt;/a&gt; as: &lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;The first thing to understand is that for any two types T and U, exactly one of the following statements is true: &lt;/p&gt;&lt;br /&gt;
&lt;ul type=disc&gt;&lt;li&gt;T is bigger than U.&lt;/li&gt;
&lt;li&gt;T is smaller than U.&lt;/li&gt;
&lt;li&gt;T is equal to U.&lt;/li&gt;
&lt;li&gt;T is not related to U. &lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;For example, consider a type hierarchy consisting of Animal, Mammal, Reptile, Giraffe, Tiger, Snake and Turtle, with the obvious relationships. (Mammal is a subclass of Animal, etc.) Mammal is a bigger type than Giraffe and smaller than Animal, and obviously equal to Mammal. But Mammal is neither bigger than, smaller than, nor equal to Reptile, it’s just different.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;He has an eleven part series on covariance and contravariance, his posts cover some C# implantation details but the ideas are generally applicable and looking at one language’s details can help with comparing and contrasting to other languages.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Wikipedia includes the following &lt;a href=&quot;http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)&quot;&gt;definition&lt;/a&gt;, the animal example is pretty popular:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Covariant&lt;/b&gt;: converting from wider (Animals) to narrower (Cats).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Contravariant&lt;/b&gt;: converting from narrower (Triangles) to wider (Shapes).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Invariant&lt;/b&gt;: Not able to convert.&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Including this is slightly redundant but this definition captures the conversion aspect and defines the relationships explicitly.  &lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Covariance and Contravariance as Order Duals&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The above are definitions that have order theory written all over them.  In fact that is pretty much a text book definition of an &lt;a href=&quot;http://en.wikipedia.org/wiki/Order_relation&quot;&gt;order Relation&lt;/a&gt; in that it is &lt;a href=&quot;http://en.wikipedia.org/wiki/Reflexive_relation&quot;&gt;reflexive&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Transitive_relation&quot;&gt;transitive&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Antisymmetric_relation&quot;&gt;antisymmetric&lt;/a&gt;. It is reflexive since Animal = Animal, transitive since Animal &amp;le; Mammal &amp;le; Cat implies Animal &amp;le; Cat, and antisymmetric since Animal &amp;le; Mammal implies not Animal &amp;ge; Mammal and in the animal example there are cases of both comparability and incomparability as you would find in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Order_relation&quot;&gt;partial order&lt;/a&gt;. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As you can see from the above definitions both sets of terms, wider/narrower or bigger/smaller, which are the same, define an order dual for comparison.  To write it more formally we will call the set C classes of various types in an OO hierarchy. So covariant would be represented by less than or equals &amp;le; and contravariant would be represented by greater than or equals &amp;ge; and a set of classes with these order relations can be written with mathematical notation as (C, &amp;le;) = (C, &amp;ge;)&lt;sup&gt;d&lt;/sup&gt; . &lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Types as Sets of Fields&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;It was in researching this post that I came across the paper &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.33.1539&quot;&gt;Adding Axioms to Cardelli-Wegner Subtyping&lt;/a&gt;&quot;. These kinds of discoveries are one of the reasons I write these posts.  In that paper they quote another paper &quot;&lt;a href=&quot;http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf&quot;&gt;On understanding types, data abstraction and polymorphism&lt;/a&gt;&quot; by Luca Cardelli and Peter Wegner:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;a type A is included in, or is a subtype of another type B when all the values of type A are also values of B, that is, exactly when A, considered as a set of values, is a subset of B&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;The ideas about types and subtypes covered in these papers extend beyond which fields a class or object has, however, I thought it would be interesting and beneficial to limit the discussion to that case.  One reason is that if you take the fields of an object or class then all subtype collections of fields will be found in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Powerset&quot;&gt;powerset&lt;/a&gt; and all subtypes will be a subset relation and these can be drawn as my favorite lattice, yes I have &lt;a href=&quot;http://www.elegantcoding.com/2012/10/the-ubiquitous-patterns-of-pascals.html#Powerset_Lattice&quot;&gt;favorite lattice&lt;/a&gt;, the &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html#Powerset_Lattice&quot;&gt;powerset lattice&lt;/a&gt;.  Also in this case covariance and contravariance are now defined as the &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html#The_Algebraic_Structure_of_the_Powerset_Lattice&quot;&gt;subset and superset operations on the powerset lattice&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Types as Sets of Fields in the Real World&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Now I always feel that a real example helps quite a bit so I have created a set of example classes, Scala traits actually, which illustrate the above ideas using a quasi-real-world example.  Please note that these code examples are designed for the purposes of illustrating these ideas and may contain design issues that one would not implement in the real world, but they should be close enough to bridge the conceptual gap, if you will.  Also this first example is should be applicable to dynamically typed languages that might use &lt;a href=&quot;http://en.wikipedia.org/wiki/Duck_typing&quot;&gt;duck typing&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/Structural_type_system&quot;&gt;structural typing&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The following Scala traits define a possible domain object hierarchy that could be used to persist data to a database and render it back to a web page among other possible uses:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;br /&gt;
&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;key-word&quot;&gt;def&lt;/span&gt; equals(that: Any) : Boolean&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;key-word&quot;&gt;def&lt;/span&gt; hashCode : Int&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;
&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PersonInfo &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; firstName : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; lastName : String&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;
&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; Address &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; street : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; street2 : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; city : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; state : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; country : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; zipCode : String&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;
&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PhoneNumber&lt;span class=&quot;key-word&quot;&gt; extends&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; phoneNumber : String&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; extension : String&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;
&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; Person &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; personInfo : PersonInfo&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; address : Address&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; phoneNumber : PhoneNumber&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;These traits yield the following field powerset lattice:&lt;/p&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxAJJx1PxYHhFWf1Hd0q1YWMbZGUBSiT1ry-0plRI6c4lcONvThcarlZVXEfbXNol0IdpaDjF5XMOIpmETGiIFFKgH-ctqJ4GuHA8Fmx7WBWI_dDVfDll9koWmyeg7O37od_WNN0dcdy1B/s1600/ExampleHierarchySetLattice.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxAJJx1PxYHhFWf1Hd0q1YWMbZGUBSiT1ry-0plRI6c4lcONvThcarlZVXEfbXNol0IdpaDjF5XMOIpmETGiIFFKgH-ctqJ4GuHA8Fmx7WBWI_dDVfDll9koWmyeg7O37od_WNN0dcdy1B/s320/ExampleHierarchySetLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Now suppose we would want to define a type for each of the above lattice points, which we probably would not do but there may be cases to do similar types of things in the real world.  Let’s define the following Scala traits that wrap the above domain object hierarchy elements:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;br /&gt;
&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PersonInfoTrait &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; personInfo : PersonInfo&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; AddressTrait {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; address : Address&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PhoneNumberTrait &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; BaseDomain {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;var&lt;/span&gt; phoneNumber : PhoneNumber&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PersonInfoAddressTrait &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; AddressTrait &lt;span class=&quot;key-word&quot;&gt;with&lt;/span&gt; PersonInfoTrait {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; AddressPhoneNumberTrait &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; AddressTrait &lt;span class=&quot;key-word&quot;&gt;with&lt;/span&gt; PhoneNumberTrait {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PersonInfoPhoneNumberTrait &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; PhoneNumberTrait &lt;span class=&quot;key-word&quot;&gt;with&lt;/span&gt; PersonInfoTrait {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;span class=&quot;key-word&quot;&gt;trait&lt;/span&gt; PersonTrait &lt;span class=&quot;key-word&quot;&gt;extends&lt;/span&gt; PersonInfoAddressTrait &lt;span class=&quot;key-word&quot;&gt;with&lt;/span&gt; AddressPhoneNumberTrait &lt;span class=&quot;key-word&quot;&gt;with&lt;/span&gt; PersonInfoPhoneNumberTrait {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Since Scala traits support multiple inheritance we can define the above type hierarchy which can be drawn as the powerset lattice that it is:&lt;/p&gt;&lt;br /&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-tbeq9uAPXv1aRPCiVdXs3xpdEaqZic-WTvs1ky_GFEL2P-VhOXYAtSvggimsXJ-sJDHIeN4j6vG5fpLGuqwpNtMgFIlkjyMExSixpXun9cAtYE8UmrXWzOzjD-GxUEU68ipWd1w0_143/s1600/ExampleHierarchyLattice.jpg&quot; imageanchor=&quot;1&quot; &gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-tbeq9uAPXv1aRPCiVdXs3xpdEaqZic-WTvs1ky_GFEL2P-VhOXYAtSvggimsXJ-sJDHIeN4j6vG5fpLGuqwpNtMgFIlkjyMExSixpXun9cAtYE8UmrXWzOzjD-GxUEU68ipWd1w0_143/s320/ExampleHierarchyLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Again we can see covariant and contravariant types defined on this lattice and each relation is actually the subset superset relation on fields.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I feel the basic observations and the above examples on order duals and covariance and contravariance make the ideas pretty strait forward for field set context.  In writing this I delved into a number of papers, adding some of them to my &quot;to read list&quot;, on Types in programming and Type Theory and I feel there are probably some deeper insights and implications of all this.  &lt;/p&gt;</description><link>http://www.elegantcoding.com/2013/03/programming-and-order-theory.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdOdS69ETQ4lKYnnD_t2cSTqZSYGX9evnOxACsyyMYdyIcnqViCx0a6cJsEw-D1xY3hDetNRcmX21KESgi0kv2vHpdZMuK6r8AzNSrcJjMsCARB5LX9ywFFyhCoZ3jsgmlZFJkgbsUgwua/s72-c/swtail.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-7209056239108093739</guid><pubDate>Tue, 04 Dec 2012 21:53:00 +0000</pubDate><atom:updated>2012-12-04T17:01:34.577-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Data Science</category><category domain="http://www.blogger.com/atom/ns#">Graph Theory</category><category domain="http://www.blogger.com/atom/ns#">Morphology</category><category domain="http://www.blogger.com/atom/ns#">Probability Theory</category><category domain="http://www.blogger.com/atom/ns#">Semantics</category><category domain="http://www.blogger.com/atom/ns#">Vector Space Model</category><title>Data Science DC: Implicit Sentiment Mining in Twitter Streams</title><description>&lt;h2&gt;Summary and more&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmEpVm_wW99aXxItagveShv3C6B70H1vROxCbydFCbGrssVswUN_PXQx5PGcW_fOwaUil2bk08PMdHRnpoM_3iRucqCJvbZqmf_89qMBi-eNJcllnIN8ruQ3C6kc65VhC0dL6evBKr20MD/s1600/IMG_1879.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmEpVm_wW99aXxItagveShv3C6B70H1vROxCbydFCbGrssVswUN_PXQx5PGcW_fOwaUil2bk08PMdHRnpoM_3iRucqCJvbZqmf_89qMBi-eNJcllnIN8ruQ3C6kc65VhC0dL6evBKr20MD/s400/IMG_1879.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

blockquote.paraphrase {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

&lt;/style&gt;&lt;!-- Data Science DC: Implicit Sentiment Mining in Twitter Streams --&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;I have been attending the &lt;a href=&quot;http://www.meetup.com/Data-Science-DC/&quot;&gt;Data Science DC meetup&lt;/a&gt; pretty regularly as it’s an interesting meetup often with quite good talks, the most recent was a very interesting presentation called &quot;&lt;a href=&quot;http://www.meetup.com/Data-Science-DC/events/75041762/&quot;&gt;Implicit Sentiment Mining in Twitter Streams&lt;/a&gt;&quot; by Maksim (Max) Tsvetovat.  He discussed number of ideas that relate to semantic discovery which are of interest to me as I am doing research into related areas including applying semantic ideas to &lt;a href=&quot;http://www.elegantcoding.com/2012/07/framework-for-software-system-naming.html&quot;&gt;software naming&lt;/a&gt;.  So I thought it would be nice to do a little review augmented with links to references that were made and additional ones that I found in the course of researching what was discussed.  I am also including some more introductory links and material as it helps me and hopefully others who are not fully versed in the world of &lt;a href=&quot;http://en.wikipedia.org/wiki/Natural_language_processing&quot;&gt;NLP&lt;/a&gt;.  The meetup was held at Google’s downtown DC office, the irony being that the meetup was about Twitter was pointed out humorously by David Lieber of Google as he introduced Harlan for the usual Data Science DC Harlan-Mark introduction.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Max starts by talking about a system that his team at George Mason built to map sentiment during the 2012 presidential election which was then used to mine sentiment from current news, in this case the media coverage of recent conflict in Gaza. This work has yielded an algorithm to show media bias.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;He points out that there are a number of things people are trying to mine and predict using twitter, the example he cites is the wired article &quot;&lt;a href=&quot;http://www.wired.com/wiredscience/2010/10/twitter-crystal-ball/&quot;&gt;Twitter Can Predict the Stock Market&lt;/a&gt;&quot;.  He sees twitter not as a social network but as a wire, an analogue of physical broadcast ether.  It’s not a media carrier but a wire that other things go into with a real-time nature where things can change very quickly.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;He moves on to Sentiment analysis, mentioning a paper called &quot;&lt;a href=&quot;http://www.customerthink.com/blog/sentiment_analysis_hard_but_worth_it&quot;&gt;Sentiment Analysis is Hard but Worth it&lt;/a&gt;&quot; by Michelle deHaaff.   He contrasts this title with what he describes as an easy &quot;old school&quot; sentiment analysis.  It&#39;s where you want to know what people think, so you take a corpus of words and a stream of data and you look for occurrences of good words vs. bad words.  You use an average or apply some formula to create a measure of sentiment, which is a naïve approach that might be used in a CS curriculum, but it does not really work in practice due to the complexity of human emotions and language that can have double and triple entendres.  He refers to a computational linguistics paper about &quot;She said&quot; jokes, which I believe is this &quot;&lt;a href=&quot;http://people.cs.umass.edu/~brun/pubs/pubs/Kiddon11.pdf&quot;&gt;That’s What She Said: Double Entendre Identification&lt;/a&gt;&quot;.  Some examples he gives of possibly deceptive and/or ambiguous statements in terms of sentiment are:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;This restaurant would deserve highest praise if you were a cockroach  (a real Yelp review ;-)&lt;/li&gt;
&lt;li&gt;This is only a flesh wound!  (Monty Python and the Holy Grail)&lt;/li&gt;
&lt;li&gt;This concert was f**ing awesome!&lt;/li&gt;
&lt;li&gt;My car just got rear-ended! F**ing awesome!&lt;/li&gt;
&lt;li&gt;A rape is a gift from God  (he lost! Good ;-)&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;He summarizes these ideas which are challenges to machines learning these things:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;Ambiguity is rampant&lt;/li&gt;
&lt;li&gt;Context matters&lt;/li&gt;
&lt;li&gt;Homonyms are everywhere&lt;/li&gt;
&lt;li&gt;Neutral words become charged as discourse changes, charged words lose their meaning&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;The field of &lt;a href=&quot;http://en.wikipedia.org/wiki/Computational_linguistics&quot;&gt;computational linguistics&lt;/a&gt; has developed a number of techniques to handle some the complexity issues above by parsing text using &lt;a href=&quot;http://en.wikipedia.org/wiki/Part_of_speech&quot;&gt;POS (parts-of-speech)&lt;/a&gt; identification which helps with homonyms and some ambiguity. He gives the following example:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;Create rules with amplifier words and inverter words:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;This concert (np) was (v) f**ing (AMP) awesome (+1) = +2&lt;/li&gt;
&lt;li&gt;But the opening act (np) was (v) not (INV) great (+1) = -1&lt;/li&gt;
&lt;li&gt;My car (np) got (v) rear-ended (v)! F**ing (AMP) awesome (+1) = +2??&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Here he introduces two concepts which modify the sentiment, which might fall under the concept of sentiment &quot;polarity classification&quot; or detection.  One idea is of an amplifier (AMP) which makes the sentiment stronger and an inverter (INV) which creates an opposite sentiment.  I found this idea of &quot;sentiment modification&quot; intriguing and did a little searching and came across a paper called &quot;&lt;a href=&quot;http://www.win.tue.nl/~mpechen/projects/pdfs/Tromp2011.pdf&quot;&gt;Multilingual Sentiment Analysis on Social Media&lt;/a&gt;&quot; which describes these ideas [page 12] and a few more including an attenuator which is the opposite of an amplifier.  It also describes some other modifiers that control sentiment flow in the text, pretty interesting concepts, actually the paper looks quite interesting, I only read the first few pages.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;He cites a paper &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.125.8012&quot;&gt;Cognitive map dimensions of the human value system extracted from the natural language&lt;/a&gt;&quot; by Alexei Samsonovich and Giorgio Ascoli.  This paper defines the following dimensions:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;Valence (good vs. bad)&lt;/li&gt;
&lt;li&gt;Relevance (me vs. others)&lt;/li&gt;
&lt;li&gt;Immediacy (now/later) &lt;/li&gt;
&lt;li&gt;Certainty (definitely/maybe)&lt;/li&gt;
&lt;li&gt;And about 9 more less-significant dimensions&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;One result which is quite interesting is that these dimensions are pretty much language independent. While searching this out I also came across &quot;&lt;a href=&quot;http://binf.gmu.edu/~asamsono/papers/sams08d.pdf&quot;&gt;Computing Semantics of Preference with a Semantic Cognitive Map of Natural Language: Application to Mood Sensing from Text&lt;/a&gt;&quot; and &quot;&lt;a href=&quot;http://www.plosone.org/article/info%3Adoi%2F10.1371%2Fjournal.pone.0010921&quot;&gt;Principal Semantic Components of Language and the Measurement of Meaning&lt;/a&gt;&quot; by the same authors.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://www.css.gmu.edu/~maksim/publications.php&quot;&gt;Max’s work&lt;/a&gt; seems to run pretty heavy in social networking theory, which includes an Orielly book: &lt;u&gt;Social Network Analysis for Startups&lt;/u&gt;.  He also mentions having quite a bit of exposure to social psychology, consisting of &quot;half a degree&quot; as he put it, which also shows in his work.  He mentions a couple of human psychological aspects, somewhat NLP related but also somewhat divergent, these are the idea of mirroring and marker words.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Mirroring is the idea that when people interact, if the interaction is positive, the example that was given was a successful flirtation, then one person will mimic the others body language.  He extends this concept to the language used by various parties, in this case the tweets they emit.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Marker words are unique words an individual speaker tends to use. The idea can also extend to common expression between speakers. His description of marker words is:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;All speakers have some words and expressions in common (e.g. conservative, liberal, party designation, etc)&lt;/li&gt;
&lt;li&gt;However, everyone has a set of trademark words and expressions that make him unique.&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;He extends this idea to the idea of linguistic mannerisms he cites are calling health care &quot;Obama care&quot; would mark you as conservative, calling Hamas &quot;freedom fighters&quot; would mark you as siding with Hamas.  Which he uses to observe mirroring:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;We detect marker words and expressions in social media speech and compute sentiment by observing and counting mirrored phrases&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;The next part of the talk gets into the details of how to do the analysis of the raw text.   One idea that he talks about is text cleaning pointing out that Twitter data is very noisy.  The text is cleaned in part using &lt;a href=&quot;http://en.wikipedia.org/wiki/Stop_words&quot;&gt;stop words&lt;/a&gt; which are words that are common and have little lexical meaning, some examples are {a, on, the, to}. His full list which he pilfered from &lt;a href=&quot;http://wordnet.princeton.edu/&quot;&gt;WordNet&lt;/a&gt; is &lt;a href=&quot;https://raw.github.com/maksim2042/DC_DataScience_Meetup/master/english_stoplist.py&quot;&gt;here&lt;/a&gt;.  &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Another important NLP concept is &lt;a href=&quot;http://en.wikipedia.org/wiki/Stemming&quot;&gt;stemming&lt;/a&gt; a &lt;a href=&quot;http://en.wikipedia.org/wiki/Linguistic_morphology&quot;&gt;linguistic morphology&lt;/a&gt; related concept, given by his example:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;Stemming identifies root of a word, stripping away: Suffixes, prefixes, verb tense, etc&lt;/li&gt;
&lt;li&gt;&quot;stemmer&quot;, &quot;stemming&quot;, &quot;stemmed&quot; -&amp;gt;&amp;gt; &quot;stem&quot;&lt;/li&gt;
&lt;li&gt;&quot;go&quot;,&quot;going&quot;,&quot;gone&quot; -&amp;gt;&amp;gt; &quot;go&quot; &lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;He takes his stemming code from the &lt;a href=&quot;https://github.com/nltk/nltk&quot;&gt;python project&lt;/a&gt;: &lt;a href=&quot;http://nltk.org/data.html&quot;&gt;Natural Language Toolkit&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Since the data being mined is coming from the internet which is used by people all over the globe, language detection is important. While the semantic concepts as outlined in the above work by Samsonovich and Ascoli may be language independent, the stemming and stop words are not, these techniques apply to most other languages but the specific tools and data do not, so the goal is to filter out other languages.  He sums this up as:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;ul&gt;&lt;li&gt;Language identification is pretty easy...&lt;/li&gt;
&lt;li&gt;Every language has a characteristic distribution of tri-grams (3-letter sequences);&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;E.g. English is heavy on &quot;the&quot; trigram&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Use open-source library &quot;guess-language&quot;&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;The Python library he uses is &lt;a href=&quot;http://pypi.python.org/pypi/guess-language&quot;&gt;guess-language&lt;/a&gt; which is based on some other implementations.  There is also a java library: &lt;a href=&quot;http://code.google.com/p/language-detection/&quot;&gt;language-detection&lt;/a&gt; on Google code which was written by &lt;a href=&quot;http://shuyo.wordpress.com/&quot;&gt;Nakatani Shuyo&lt;/a&gt;.  All of these use a &lt;a href=&quot;http://en.wikipedia.org/wiki/Trigram&quot;&gt;trigram&lt;/a&gt; approach to language detection which uses an &lt;a href=&quot;http://en.wikipedia.org/wiki/N-gram&quot;&gt;n-gram&lt;/a&gt; of characters and their probabilities to identify languages this approach is described in &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.9367&quot;&gt;N-Gram-Based Text Categorization&lt;/a&gt;&quot;.&lt;/p&gt;&lt;p&gt;After the text is filtered to English, cleaned, and stemmed this leaves roots of big words, words that carry more meaning.  These are used to create term vectors.  Term vectors are a way to map documents into a &lt;a href=&quot;http://en.wikipedia.org/wiki/Vector_space&quot;&gt;vector space&lt;/a&gt;, this is known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Vector_space_model&quot;&gt;Vector Space Model (VSM)&lt;/a&gt;, and is a fairly common approach, it is used in Lucene and its derivatives like Solr and ElasticSearch.  Term vectors can be built with different levels of granularity, generally in Lucene this done at the document level but it can also be done at the sentence level.&lt;/p&gt;&lt;p&gt;I was hoping to better describe what he is doing with the term vectors and how they relate to the graphs that he creates but I am unclear as to whether his term vectors are built at the document (tweet) level or sentence level, I believe it is the sentence level as he refers to a common word in two sentences being the intersection of two different term vectors.  He then starts talking about bigrams and linking speakers to bigrams, I am not sure how these relate to the term vectors.  In this case the bigrams, n-grams order 2, refer to words as opposed to the trigrams mentioned above for language detection which were for letters.&lt;/p&gt;&lt;p&gt;Regardless of how they are created the system he describes uses bigrams of words linked to speakers which form a two-mode network, a concept that I was unfamiliar with which is described in &quot;&lt;a href=&quot;http://www.steveborgatti.com/papers/2modeconcepts.pdf&quot;&gt;2-Mode Concepts in Social Network Analysis&lt;/a&gt;&quot;.  This two-mode graph technique drives the final graphs for the sets, in the cases of {Santorum, Gingrich, Romney} and {IDF, Hamas}.   He also points out by counting of the occurrence of bigrams the most common bigrams give the nature of discourse structure.&lt;/p&gt;&lt;p&gt;Counting bigrams enables a technique to throw out bigrams that only occur once in a certain time period, purging single occurrences cuts out the noise.  The number of co-occurrences are &lt;a href=&quot;http://en.wikipedia.org/wiki/Power_law&quot;&gt;power law distributed&lt;/a&gt; which reduces this from a big data problem to something that runs on an Amazon micro instances.  Also dates were recorded for each occurrence which allowed noncurrent topics to be purged from the current data over time.&lt;/p&gt;&lt;p&gt;The algorithm to detect media bias, which he warned is naïve, yielded:&lt;/p&gt;&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;5&quot;&gt;&lt;tr&gt;&lt;td&gt;NPR&lt;/td&gt;&lt;td&gt;58% favorable to IDF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Aljazeera&lt;/td&gt;&lt;td&gt;53% favorable to IDF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CNN&lt;/td&gt;&lt;td&gt;59% favorable to IDF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;BBC&lt;/td&gt;&lt;td&gt;54% favorable to IDF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;FOX&lt;/td&gt;&lt;td&gt;51% favorable to Hamas&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CNBC&lt;/td&gt;&lt;td&gt;60% favorable to IDF&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;I hope others find this useful, I sure learned a lot digging into the presentation and researching the ideas presented.  This post ran longer than I had originally thought.  I attribute this to the broad subject area that this talk covered.  Semantics is a complex and deep topic with many facets and approaches, I was hoping to throw some &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html&quot;&gt;order theory&lt;/a&gt; related ideas in as well, as they are quite applicable, but that will have to wait for another time.&lt;/p&gt;&lt;h2&gt;References&lt;/h2&gt;&lt;p&gt;The following references are a mix of works referenced in the presentation and that I came across while writing this, many are linked above but not all are:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.meetup.com/Data-Science-DC/&quot;&gt;Data Science DC meetup&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.meetup.com/Data-Science-DC/events/75041762/&quot;&gt;Data Science DC:Implicit Sentiment Mining in Twitter Streams&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.meetup.com/Data-Science-DC/files/&quot;&gt;Event Audio&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/maksim2042/DC_DataScience_Meetup&quot;&gt;Code and Slides&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.css.gmu.edu/~maksim/publications.php&quot;&gt;Maksim Tsvetovat Publications&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.elegantcoding.com/2012/05/math-of-search-and-similarity.html&quot;&gt;The Math of Search and Similarity, Part One: Lucene, the Boolean Model, tf*idf, and the Vector Space Model&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.customerthink.com/blog/sentiment_analysis_hard_but_worth_it&quot;&gt;Sentiment Analysis is Hard but Worth it&lt;/a&gt; by Michelle deHaaff.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://people.cs.umass.edu/~brun/pubs/pubs/Kiddon11.pdf&quot;&gt;That’s What She Said: Double Entendre Identification&lt;/a&gt; by Chloe Kiddon and Yuriy Brun&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wordnet.princeton.edu/&quot;&gt;WordNet&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://nlp.stanford.edu/&quot;&gt;Stanford NLP&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://nltk.org/data.html&quot;&gt;Natural Language Toolkit&lt;/a&gt;, &lt;a href=&quot;http://github.com/nltk/nltk&quot;&gt;github&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.win.tue.nl/~mpechen/projects/pdfs/Tromp2011.pdf&quot;&gt;Multilingual Sentiment Analysis on Social Media&lt;/a&gt; by Erik Tromp&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.cs.cornell.edu/home/llee/omsa/omsa.pdf&quot;&gt;Opinion mining and sentiment analysis&lt;/a&gt; by Bo Pang and Lillian Lee&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.csc.villanova.edu/~tway/publications/IKE7710_Carpenter_Way.pdf&quot;&gt;Tracking Sentiment Analysis through Twitter&lt;/a&gt; by Thomas Carpenter and Thomas Way&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://homepage.cs.uiowa.edu/~ymejova/publications/CompsYelenaMejova.pdf&quot;&gt;Sentiment Analysis: An Overview&lt;/a&gt; by Yelena Mejova&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.9367&quot;&gt;N-Gram-Based Text Categorization&lt;/a&gt; (1994) by William B. Cavnar , John M. Trenkle&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.steveborgatti.com/papers/2modeconcepts.pdf&quot;&gt;2-Mode Concepts in Social Network Analysis&lt;/a&gt; by Stephen P. Borgatti&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://jponnela.com/web_documents/twomode.pdf&quot;&gt;Basic notions for the analysis of large two-mode networks&lt;/a&gt; by Matthieu Latapy, Clemence Magnien, and Nathalie Del Vecchio&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/12/data-science-dc-implicit-sentiment.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmEpVm_wW99aXxItagveShv3C6B70H1vROxCbydFCbGrssVswUN_PXQx5PGcW_fOwaUil2bk08PMdHRnpoM_3iRucqCJvbZqmf_89qMBi-eNJcllnIN8ruQ3C6kc65VhC0dL6evBKr20MD/s72-c/IMG_1879.JPG" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-9010067447037054615</guid><pubDate>Mon, 22 Oct 2012 18:39:00 +0000</pubDate><atom:updated>2012-10-22T21:23:25.917-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Clojure</category><category domain="http://www.blogger.com/atom/ns#">Combinatorics</category><category domain="http://www.blogger.com/atom/ns#">Math</category><category domain="http://www.blogger.com/atom/ns#">Number Theory</category><category domain="http://www.blogger.com/atom/ns#">Scala</category><title>The Math of the First Scala Assignment</title><description>&lt;h2&gt;Math and Scala with a Little Bit of Clojure&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsWdZjh4fCBFO96QLmsQKoEY6OtgnfIkbyuOpXCycahtvwQh1qVXzVfa74utjD1rXdEAulvcgJQv1-JI7_V_w59a8HjPONwYcbud0O1X2TVq25cPo_wrgKJDCn9mSWHUJf20NkcokcXi-6/s1600/crater.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;289&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsWdZjh4fCBFO96QLmsQKoEY6OtgnfIkbyuOpXCycahtvwQh1qVXzVfa74utjD1rXdEAulvcgJQv1-JI7_V_w59a8HjPONwYcbud0O1X2TVq25cPo_wrgKJDCn9mSWHUJf20NkcokcXi-6/s400/crater.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
div.source-code {
    font-family       : Andale Mono, Lucida Console, Monaco, fixed, monospace;
    color             : #000;
    background-color  : #eee;
    font-size         : 12px;
    border            : 1px dashed #999999;
    line-height       : 14px;
    padding           : 5px;
    overflow          : auto;
    width             : 100%;
    text-indent       : 0px;
    margin-top        : 8px;
    margin-bottom     : 8px;
}

p.codeline {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    color:black;
}

p.codeline1 {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    text-indent:.5in;
    color:black;
}

p.codeline2 {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    text-indent:1in;
    color:black;
}

p.codeline3 {

    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    text-indent:1.5in;
    color:black;
}
&lt;/style&gt;&lt;!--The Math of the First Scala Assignment--&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Martin Odersky is teaching &lt;a href=&quot;https://www.coursera.org/course/progfun&quot;&gt;Functional Programming Principles in Scala&lt;/a&gt; on Coursera and I attempted to complete this course, I completed the first assignment on recursion before the hard deadline which was hard given my work schedule at the time, however, I decided not to submit it, I remembered how much I hate school, or at least being a student in a school even a virtual one, I have my own timeline and my own interests.  While doing the problems I realized, and I know this is not a major revelation, that these first three problems are set in the context of math.  However, some of that math may not be immediately obvious to everyone so I thought it would make a nice post.  I was originally going to publish my solutions in this post, after the hard deadline of course, but there was recently some unpleasantness about publishing solutions and cheating and it seems that it is still possibly a violation of the honor code.  I feel having some code for two of the problems increases the quality of this posting so I will provide my examples for those solutions in Clojure, the non solution code will be in Scala so it’s now a hybrid posting.  Also the ideas for this post forced me to finally write my previous post on &lt;a href=&quot;http://www.elegantcoding.com/2012/10/the-ubiquitous-patterns-of-pascals.html&quot;&gt;Pascal’s Triangle&lt;/a&gt;, which this post will draw on.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Exercise 1: Pascal’s Triangle&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The first problem is to recursively compute a binomial coefficient within Pascal’s triangle, this is fairly trivial if you have exposure to &lt;a href=&quot;http://en.wikipedia.org/wiki/Recurrence_relation&quot;&gt;recurrence relations&lt;/a&gt; and recognize it as such, it is expressed as follows:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9_x9xi2-ZJDciMmYs2mKeBcca5Qj_3QM9U6qQioprlnhuMgTfdW6d3lyvloj6yQzzu7rKzGW_dewRB-VucxTM2bShT1NtjiQ_va9XcKOOYD8KPzdAwWy4tvaVTY6NazuybSNgcYOBWi1K/s1600/Pascal%2527s+Identity.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9_x9xi2-ZJDciMmYs2mKeBcca5Qj_3QM9U6qQioprlnhuMgTfdW6d3lyvloj6yQzzu7rKzGW_dewRB-VucxTM2bShT1NtjiQ_va9XcKOOYD8KPzdAwWy4tvaVTY6NazuybSNgcYOBWi1K/s400/Pascal%2527s+Identity.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Some other common recurrence relations that are popular in CS educational circles include, &lt;a href=&quot;http://en.wikipedia.org/wiki/Fibonacci_number&quot;&gt;Fibonacci numbers&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Triangular_number&quot;&gt;triangular numbers&lt;/a&gt; and of course the &lt;a href=&quot;http://en.wikipedia.org/wiki/Factorial&quot;&gt;factorial function&lt;/a&gt; these are expressed as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfdBhbZj_0I93CjbSoW3zXDNLLYuWRYBRIck2g2wPfgwndP-htk7IcZkLcNyeuCbTZ_FffGRLjt4XBHovoDCkkt0jtTWdTIMqYh-BE2LOhAyu5Uhz23iSupHInOTGxBsGwpdDRZQFv0_g1/s1600/Fib.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;133&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfdBhbZj_0I93CjbSoW3zXDNLLYuWRYBRIck2g2wPfgwndP-htk7IcZkLcNyeuCbTZ_FffGRLjt4XBHovoDCkkt0jtTWdTIMqYh-BE2LOhAyu5Uhz23iSupHInOTGxBsGwpdDRZQFv0_g1/s400/Fib.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj83a-hqXolf139u_7dGA3M3pLGsSG9caCQ2PJ_bSLZSQ4QLsfgx29HW1U9SNsGSeW8SJUuaBo1iK4UEOLsUAPabml0cdlWIhLXbLVGztYktybdX4VXWhC0jaaeJxJ0y2Agzhz7x0JLX-VF/s1600/Triangualar+Numbers.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;105&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj83a-hqXolf139u_7dGA3M3pLGsSG9caCQ2PJ_bSLZSQ4QLsfgx29HW1U9SNsGSeW8SJUuaBo1iK4UEOLsUAPabml0cdlWIhLXbLVGztYktybdX4VXWhC0jaaeJxJ0y2Agzhz7x0JLX-VF/s400/Triangualar+Numbers.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGPGkUW_EMFAWjUfmjXEyTvxn4MXzwROoLRrR63WqSvhHlVgsCmDZ81Mk9HYag2vE443HHQJgjO-fDw1P-NpJMYFgROXpv-hcM-buEp_G_yEuXdsDLBt3mkK1pcE77AWFDud4umD4xYNi/s1600/factorial.2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;170&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVGPGkUW_EMFAWjUfmjXEyTvxn4MXzwROoLRrR63WqSvhHlVgsCmDZ81Mk9HYag2vE443HHQJgjO-fDw1P-NpJMYFgROXpv-hcM-buEp_G_yEuXdsDLBt3mkK1pcE77AWFDud4umD4xYNi/s400/factorial.2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I chose a term based representation of the factorial function over the more traditional:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiObTMHIterHyYbfOPqHqLmDjWrFSvQuKRlnGAZj28McCUEnmtLy3PCwyi4fqPdzHXlplUpvFIUWsTHpre8r8a2UQ0tg5TAtt3yi_r6xbsE_cSiW6O-N0HRpdoVKS6_Ixe-k2NwSD6Maysi/s1600/factorial.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;101&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiObTMHIterHyYbfOPqHqLmDjWrFSvQuKRlnGAZj28McCUEnmtLy3PCwyi4fqPdzHXlplUpvFIUWsTHpre8r8a2UQ0tg5TAtt3yi_r6xbsE_cSiW6O-N0HRpdoVKS6_Ixe-k2NwSD6Maysi/s400/factorial.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;These can be implemented recursively in Scala as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; fibonacci(n : Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;if&lt;/b&gt;(n &amp;lt;= 1)&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;1&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;fibonacci(n - 1) + fibonacci(n - 2)  &lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; triangularNumber(n : Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;if&lt;/b&gt;(n &amp;lt;= 1)&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;1&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;n + triangularNumber(n - 1)  &lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; factorial(n : Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;if&lt;/b&gt;(n &amp;lt;= 1)&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;1&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;else&lt;/b&gt; &lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;n * factorial(n - 1)  &lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;All of the above examples are inefficient and in many cases considered to be naïve solutions.  The Fibonacci example is terrible as it incurs an exponential number of function calls, fortunately there ways to optimize these algorithms.  One potential approach would be to use the closed formulas for &lt;a href=&quot;http://www.elegantcoding.com/2011/07/triangles-triangular-numbers-and.html&quot;&gt;triangular numbers&lt;/a&gt; or Binet’s formula for &lt;a href=&quot;http://www.elegantcoding.com/2012/02/fibonacci-math-of-agile.html&quot;&gt;Fibonacci numbers&lt;/a&gt;.  I will ignore those as I have covered them previously and they are not what I am going for here.  I want to look at two optimizations, one is a way is the use of the tail call optimization and the second is to reduce the number of function calls.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tail_call&quot;&gt;Tail call optimization&lt;/a&gt;, put simply, is a mechanism that allows certain recursive functions that are written in a tail recursive form to be converted to iteration when they are executed.  It is my understanding that this requires some extra work in the JVM, at least in the older versions, I think 7 and 8 makes changes for this.  So this extra work requires some special syntax beyond simply putting your code in tail recursive form, Lisp and Scheme for example do this automatically, in Scala this requires the @tailrec annotation, using this form our functions get converted as follows:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; triangularNumber(n:Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;@tailrec&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;def&lt;/b&gt; triangularNumberAcc(acc: Long, n: Int): Long = {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;&lt;b&gt;if&lt;/b&gt; (n &amp;lt;= 1) acc&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;&lt;b&gt;else&lt;/b&gt; triangularNumberAcc(n + acc, n - 1)&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;triangularNumberAcc(1, n)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; factorial(n:Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;@tailrec&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;def&lt;/b&gt; factorialAcc(acc: Long, n: Int): Long = {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;&lt;b&gt;if&lt;/b&gt; (n &amp;lt;= 1) acc&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;&lt;b&gt;else&lt;/b&gt; factorialAcc(n * acc, n - 1)&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;factorialAcc(1, n)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;As you can see the tail recursive forms take on an accumulator parameter.  The other optimization  I mentioned was to get rid of the extra function call for the Fibonacci, this is done by calculating the series using a second accumulator parameter, so that term Fn and term Fn+1 are passed as accumulator parameters.   This following example came out really nice as the base function sequenceGenerator can also generate the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lucas_number&quot;&gt;Lucas&lt;/a&gt; numbers if seeded appropriately:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;@tailrec&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; sequenceGenerator(n: Int, t0: Long, t1: Long): Long = {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;if&lt;/b&gt;(n &amp;lt;= 0)&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;t0&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;sequenceGenerator(n - 1, t1, t0 + t1)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; fibonacci(n : Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;sequenceGenerator(n, 0, 1)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; lucas(n : Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;sequenceGenerator(n, 2, 1)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Going back to Pascal’s Identity if we look at the example from my last post:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy0GGD1DpkKox6bsVGYTAm1Y3JakhnSBzZsbrvzARGiJDL5xe3CTMdPNJfmaXmeKDx781el2GlY0hirGeZ5FOYaI4UEEr4NSiuc5kpzaRirVQxbuJ1BAdC3sz2GWni0S23-A83kV_U1xA2/s1600/bc%25285%252C3%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgy0GGD1DpkKox6bsVGYTAm1Y3JakhnSBzZsbrvzARGiJDL5xe3CTMdPNJfmaXmeKDx781el2GlY0hirGeZ5FOYaI4UEEr4NSiuc5kpzaRirVQxbuJ1BAdC3sz2GWni0S23-A83kV_U1xA2/s400/bc%25285%252C3%2529.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;We can represent the values that get calculated for this example visually as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQeZU5ohguk26LfYak9F9JRkUUkrgp5yWkIk_9E-rTmg1E_NxrBODOUTOVMSbF15G6DxOU1sa02Vb9SpQA1VIavSUlsKk_Bzp2DAYCpA1Cr5Y8VncQXxke5RbY03HQTT5NBPQda5xUkK9D/s1600/pascalsTriangleAddLatticeCoefficientScala.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQeZU5ohguk26LfYak9F9JRkUUkrgp5yWkIk_9E-rTmg1E_NxrBODOUTOVMSbF15G6DxOU1sa02Vb9SpQA1VIavSUlsKk_Bzp2DAYCpA1Cr5Y8VncQXxke5RbY03HQTT5NBPQda5xUkK9D/s400/pascalsTriangleAddLatticeCoefficientScala.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This gives some sense of how the recursive solution moves up through the triangle to sum the values, the example code, in Clojure, the naïve solution is:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;(defn bc [r c]&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;(if (or (&amp;lt;= c 0) (&amp;lt;= r 0) (&amp;lt;= r c))&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;1&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;(+ (bc (dec r) (dec c)) (bc (dec r) c))&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;)&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Additionally the Clojure version of our Binomial Coefficient can be similarly single call/tail call optimized:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;(defn bc [rr cc]&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;(loop [r rr c cc acc 1]&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;(if (or (= c 0) (= r 0) (= r c))&lt;/p&gt;&lt;p class=&quot;codeline3&quot;&gt;acc&lt;/p&gt;&lt;p class=&quot;codeline3&quot;&gt;(recur (dec r) (dec c) (/ (* acc r) c)))&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;)&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;As mentioned most of these have closed form formulas like Binet’s formula for Fibonacci numbers.  Also if we take the formula for the binomial coefficient and since r &amp;ge; c we can get the following cancelation of c!:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS8l6XBd8ZXna-yAt6ANZNnqccohgLBQxp4uCBgz0FZHbWcGCdJv4Gn5a314bUjBZJlBAl8BHeIR7FjX6nXmXzqEPUvKwfnLU68ht1-Sg2mylviDpOo4hDaX8NMD9jyZyZKRSS7_Q32x06/s1600/Binomial-cancel.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;32&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS8l6XBd8ZXna-yAt6ANZNnqccohgLBQxp4uCBgz0FZHbWcGCdJv4Gn5a314bUjBZJlBAl8BHeIR7FjX6nXmXzqEPUvKwfnLU68ht1-Sg2mylviDpOo4hDaX8NMD9jyZyZKRSS7_Q32x06/s400/Binomial-cancel.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Which can be implemented in Scala, using the factorial function defined above, as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; partialFactorial(s : Int, e: Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;@tailrec&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;def&lt;/b&gt; partialFactorialAcc(s : Int, e: Int, acc: Long): Long = {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;&lt;b&gt;if&lt;/b&gt;(e &amp;gt;= s) acc&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;&lt;b&gt;else&lt;/b&gt;  partialFactorialAcc(s - 1, e, s * acc)&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;partialFactorialAcc(e, s, e)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;&lt;b&gt;def&lt;/b&gt; binomialCoefficient(r : Int , c : Int) : Long = {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;if&lt;/b&gt;((c &amp;lt;= 0) || (r &amp;lt;= 0) || (r &amp;lt;= c))&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;1&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;&lt;b&gt;else&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;partialFactorial(r, c+1)/factorial(r-c)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Both of these two “optimized” solutions for the binomial coefficient introduce division which can be problematic due to remainders and floating point rounding errors this would also be the case for the closed form approaches to calculating these numbers.  There is a variant for the binomial coefficient that is discussed in a &lt;a href=&quot;&quot;&gt;paper&lt;/a&gt; which uses a &lt;a href=&quot;http://en.wikipedia.org/wiki/Greatest_common_divisor&quot;&gt;gcd&lt;/a&gt; calculation to try to deal with these issues.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Another interesting observation in terms of how values are calculated between the naïve recursive approach and the tail recursive accumulator approach is that there seems to be some &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html#Order_Duality&quot;&gt;order duality&lt;/a&gt; on how the calculations are performed.  In the naïve approaches the recursion goes to the bottom and accumulates as it comes back up in the call stack.  In the accumulator versions the values are accumulated on the way down and returned from the bottom of the call stack.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Exercise 2: Parentheses Balancing&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The next problem is not so much about the solution as it is about the combinatorial properties of the input values.  The problem was to take a string and determine if the parenthesis in the string matched, this is also probably pretty common CS educational fodder.  So there will be no code for this problem.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The math that we are interested in here relates to the &lt;a href=&quot;http://www.elegantcoding.com/2012/10/the-ubiquitous-patterns-of-pascals.html#Central_Binomial_Coefficient_Symmetry&quot;&gt;central binomial coefficient&lt;/a&gt;, it is a number sequence known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Catalan_number&quot;&gt;Catalan numbers&lt;/a&gt; after the Belgian mathematician &lt;a href=&quot;http://en.wikipedia.org/wiki/Eug%C3%A8ne_Charles_Catalan&quot;&gt;Eugène Charles Catalan&lt;/a&gt;.  It is given by the following equations:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgUWS3g2zUP_adGVq85oBemfOjpi5pnifPrxftdeDbKyWgHZSfS2AAnpSRZ_odx6Ucru6_eWKsY37-WFuKsigA5hKNyuKQXYlYHcaIrfFSmbdVGyG1I8_8UWv3uvTWo6wIcCijO_fFlCOR/s1600/Catalan-eq.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgUWS3g2zUP_adGVq85oBemfOjpi5pnifPrxftdeDbKyWgHZSfS2AAnpSRZ_odx6Ucru6_eWKsY37-WFuKsigA5hKNyuKQXYlYHcaIrfFSmbdVGyG1I8_8UWv3uvTWo6wIcCijO_fFlCOR/s400/Catalan-eq.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF_e5voNV3NXXq39NVYCAotOcMSGKXHXjYuzn63UaVWp9FPnNj8RDwfbniTaGxsi2Pras3icjDl-hRC7qUdZ2DUhecwulI0GAd854G8RIVXY5cbSjXVA8fDB99nFRRKu-vOwtfxZ1Rqjsr/s1600/Catalan-recur.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;48&quot; width=&quot;307&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhF_e5voNV3NXXq39NVYCAotOcMSGKXHXjYuzn63UaVWp9FPnNj8RDwfbniTaGxsi2Pras3icjDl-hRC7qUdZ2DUhecwulI0GAd854G8RIVXY5cbSjXVA8fDB99nFRRKu-vOwtfxZ1Rqjsr/s400/Catalan-recur.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;In the original problem the text containing parentheses was the input, since a parenthesis counting algorithm would need to filter the text or implement some type of get next parenthesis function, we will assume that we have a string that only has only parenthesis.  First thing to notice that valid input strings need to be of even length.  Each term of the Catalan numbers describes how many possible sets of matching parenthesis you can have for each number n.  The table below illustrates the first five possibilities:&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot;&gt;&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;bottom&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;bottom&quot; align=&quot;center&quot;&gt;   &lt;p&gt;C&lt;sub&gt;n&lt;/sub&gt;&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;bottom&quot; align=&quot;center&quot;&gt;   &lt;p&gt;Matching parentheses set&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;bottom&quot; align=&quot;center&quot;&gt;   &lt;p&gt;Total String Size 2&lt;sup&gt;2n&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n=0&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;1 way&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;top&quot;&gt;   &lt;p&gt;&amp;lambda;&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;0&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n=1&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;1 way&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;top&quot;&gt;   &lt;p&gt;()&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;2&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n=2&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;2 ways&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;top&quot;&gt;   &lt;p&gt;()(), (())&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;16&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n=3&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;5 ways&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;top&quot;&gt;   &lt;p&gt;()()(), ()(()), (())(), (()()), ((()))&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;64&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n=4&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;14 ways&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;top&quot;&gt;   &lt;p&gt;()()()(), ()()(()), ()(())(), ()(()()), ()((())),&lt;/p&gt;&lt;p&gt;(())()(), (())(()), (()())(), ((()))(), (()()()),&lt;/p&gt;&lt;p&gt;(()(())), ((())()), ((()())), (((())))&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;256&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td width=&quot;55&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;n=5&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;66&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;42 ways&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;294&quot; valign=&quot;top&quot;&gt;   &lt;p&gt;()()()()(), ()()()(()), ()()(())(), ()()(()()), ()()((())),&lt;/p&gt;&lt;p&gt;()(())()(), ()(())(()), ()(()())(), ()((()))(), ()(()()()),&lt;/p&gt;&lt;p&gt;()(()(())), ()((())()), ()((()())), ()(((()))), (())()()(),&lt;/p&gt;&lt;p&gt;(())()(()), (())(())(), (())(()()), (())((())), (()())()(),&lt;/p&gt;&lt;p&gt;(()())(()), ((()))()(), ((()))(()), (()()())(), (()(()))(),&lt;/p&gt;&lt;p&gt;((())())(), ((()()))(), (((())))(), (()()()()), (()()(())),&lt;/p&gt;&lt;p&gt;(()(())()), (()(()())), (()((()))), ((())()()), ((())(())),&lt;/p&gt;&lt;p&gt;((()())()), (((()))()), ((()()())), ((()(()))), (((())())),&lt;/p&gt;&lt;p&gt;(((()()))), ((((()))))&lt;/p&gt;&lt;/td&gt;   &lt;td width=&quot;95&quot;  valign=&quot;top&quot; align=&quot;center&quot;&gt;   &lt;p&gt;1024&lt;/p&gt;&lt;/td&gt;  &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;The table above also includes the number of possible strings with only the two parentheses, which grows at a rate 2&lt;sup&gt;2n&lt;/sup&gt;.  This table is based on one from a &lt;a href=&quot;http://www.geometer.org/mathcircles/catalan.pdf&quot;&gt;paper&lt;/a&gt; by Tom Davis on Catalan numbers.  It is quite interesting paper as Catalan numbers also describe diagonal avoiding paths, “mountain ranges”, &lt;a href=&quot;http://en.wikipedia.org/wiki/Noncrossing_partition&quot;&gt;noncrossing partitions&lt;/a&gt;, multiplication orderings, the number of different ways a &lt;a href=&quot;http://en.wikipedia.org/wiki/Convex_polygon&quot; title=&quot;Convex polygon&quot;&gt;convex polygon&lt;/a&gt; with n&amp;nbsp;+&amp;nbsp;2 sides can be cut into triangles, to mention a few.  Another interesting thing about Catalan numbers is they can be described by a recurrence relation:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_MzVN4ojAqNioYI5SPei0B36xZsI0RCEQjxylk8GV3zfb_MJkbkZM572I8V2Qp5qOOg4mlR1UqSbyeq9kLQ7717khi5jlnNohfnP6HQODh4-2JQ7ebwlqzsmvQHSjZrl3BVs3vq1aKXrp/s1600/C1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;15&quot; width=&quot;79&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_MzVN4ojAqNioYI5SPei0B36xZsI0RCEQjxylk8GV3zfb_MJkbkZM572I8V2Qp5qOOg4mlR1UqSbyeq9kLQ7717khi5jlnNohfnP6HQODh4-2JQ7ebwlqzsmvQHSjZrl3BVs3vq1aKXrp/s400/C1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWaQmtvsV0ccyAtfLvPswUtCEx8isbo5ldNbDFt7XE5FQeYLJktKX2VPdvWD89CMpiXuqUrjujXX-XGRE7Juv61VS22XdqMbMMy6khrszy5q0_y2cRaFl1I46-JvfIQs079-E7X_YEvIKY/s1600/C2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;15&quot; width=&quot;138&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWaQmtvsV0ccyAtfLvPswUtCEx8isbo5ldNbDFt7XE5FQeYLJktKX2VPdvWD89CMpiXuqUrjujXX-XGRE7Juv61VS22XdqMbMMy6khrszy5q0_y2cRaFl1I46-JvfIQs079-E7X_YEvIKY/s400/C2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-CPY3wPVTLoTaroP5nqznnW4FFqEitQtMbuEI6JdRb4Fwjptt1-rvwtCRq5IGc49MVU8pfQ470GJsHmQFNYBXjG7mXXoZPbDhJ0YgN-o2_cCNRKaDZDEau_fBn-SPFA4gxdwbtJfmgnGg/s1600/C3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;15&quot; width=&quot;197&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-CPY3wPVTLoTaroP5nqznnW4FFqEitQtMbuEI6JdRb4Fwjptt1-rvwtCRq5IGc49MVU8pfQ470GJsHmQFNYBXjG7mXXoZPbDhJ0YgN-o2_cCNRKaDZDEau_fBn-SPFA4gxdwbtJfmgnGg/s400/C3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6z4xYThEC76KaJHY6k3wqedI0SjtQZ4s2KSSdrOasy6OW7SvxFLeeb_sv-G5l5NqO9QKg9gqlE5sXeZLM0wqrIjYuhuCL7axuwUceRpHMKmAyPd0lbBQoTn8or-aDJ3LS13gJHEo6bI6b/s1600/C4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;15&quot; width=&quot;256&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6z4xYThEC76KaJHY6k3wqedI0SjtQZ4s2KSSdrOasy6OW7SvxFLeeb_sv-G5l5NqO9QKg9gqlE5sXeZLM0wqrIjYuhuCL7axuwUceRpHMKmAyPd0lbBQoTn8or-aDJ3LS13gJHEo6bI6b/s400/C4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA5YUfUUgmT_gY-z0I_sWzhBge7i57ZPTJqCipWfuq15stBlhCoQVVSzzua050Hxfqnroc9a02GFZovr_T05PBTjfdIpeALr3PxSAaXdUvKg-Uy8wz_rqm3iXHvBlWpbFD6yKW1RblNlt-/s1600/Cn.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;15&quot; width=&quot;373&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhA5YUfUUgmT_gY-z0I_sWzhBge7i57ZPTJqCipWfuq15stBlhCoQVVSzzua050Hxfqnroc9a02GFZovr_T05PBTjfdIpeALr3PxSAaXdUvKg-Uy8wz_rqm3iXHvBlWpbFD6yKW1RblNlt-/s400/Cn.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I confess that this may not be that pragmatic in terms of solving the problem, but I think it is interesting and possibly gives a larger context to the problem.  &lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Exercise 3: Counting Change&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The last problem, which is probably something of a CS classic problem as it appears in &lt;a href=&quot;http://mitpress.mit.edu/sicp/full-text/book/book.html&quot;&gt;SICP&lt;/a&gt;, is the problem of &lt;a href=&quot;http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.2&quot;&gt;counting change&lt;/a&gt;, given some numerical amount and some set of coin denominations we need to count the number of ways that we can represent the amount given the set of denominations. I confess to having cheated a little bit, well ok a lot, I found this post by &lt;a href=&quot;http://www.billthelizard.com/2009/12/sicp-exercise-114-counting-change.html&quot;&gt;Bill the Lizard&lt;/a&gt;. I also found this &lt;a href=&quot;http://www.billthelizard.com/2010/12/sicp-219-counting-change-revisited.html&quot;&gt;post&lt;/a&gt; with a more elegant solution and translated these into both Scala and Clojure, well ok I guess it’s not cheating since I didn’t submit it.  The clojure version is:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;(defn count-change [amount coin-values]&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;(cond (= amount 0) 1&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;(or (&amp;lt; amount 0) (empty? coin-values)) 0&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;:else&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;(+ (count-change amount (rest coin-values))&lt;/p&gt;&lt;p class=&quot;codeline3&quot;&gt;(count-change (- amount (first coin-values)) coin-values))&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;)&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;)&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The math here is from number theory and combinatorics, actually it might fall under combinatorial number theory.  In number theory there are two pretty big areas, one is multiplicative number theory which dates back at least to the Greeks and deals with how numbers divide and remainders and prime numbers which includes things like the well known &lt;a href=&quot;http://en.wikipedia.org/wiki/Fundamental_theorem_of_arithmetic&quot;&gt;fundamental theorem of arithmetic&lt;/a&gt;.  A relatively newer area of number theory is known as arithmetic number theory and is mostly attributed to Euler. In fact it was Euler who initiated the study of number partitions in his book &lt;u&gt;Introduction to the Analysis of the Infinite&lt;/u&gt; in 1748.  It is the math of &lt;a href=&quot;http://en.wikipedia.org/wiki/Partition_%28number_theory%29&quot;&gt;number partitions&lt;/a&gt; that our change problem falls under.   We are basically counting a subset of the partitions of a number’s &lt;a href=&quot;http://oeis.org/A000041&quot;&gt;full partition set&lt;/a&gt;.  In fact we can create a function that uses a Clojure &lt;a href=&quot;http://en.wikipedia.org/wiki/List_comprehension&quot;&gt;list comprehension&lt;/a&gt; to create a number partition function from our change counting function:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p class=&quot;codeline&quot;&gt;(defn number-partition [n]&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;(count-change n (for [x (range 1 (inc n))] x ))&lt;/p&gt;&lt;p class=&quot;codeline&quot;&gt;) &lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://mathworld.wolfram.com/PartitionFunctionP.html&quot;&gt;Functions&lt;/a&gt; to count partitions have been studied over the years and Euler invented a &lt;a href=&quot;http://mathworld.wolfram.com/GeneratingFunction.html&quot;&gt;generating function&lt;/a&gt; that gives rise to, you guessed it, a recurrence equation to count partitions:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Mea7GQFH6d8n74iOo7Fq-9ENfiHoEoAqQdVvmkjXk6O9g0HlWvzE7PkWr_4r3bvaSTrVg4lWaviB4R2g1RiFclCv9Tfs5k25FnAm8WjURjbzW6un5qEqPNNGCWInY9qrPbGFpCkPfSL6/s1600/P%2528n%2529.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;44&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5Mea7GQFH6d8n74iOo7Fq-9ENfiHoEoAqQdVvmkjXk6O9g0HlWvzE7PkWr_4r3bvaSTrVg4lWaviB4R2g1RiFclCv9Tfs5k25FnAm8WjURjbzW6un5qEqPNNGCWInY9qrPbGFpCkPfSL6/s400/P%2528n%2529.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;School’s out&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;So there it is some (hopefully) interesting math context for these problems. I guess it’s kind of a gray area but I am pretty sure I didn’t cross the line on the whole honor code thing but even if I did I believe it’s covered by the People&#39;s Freedom of Choices and Voices Act. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Well it was a fun post to write, I got some code in a post, something I haven&#39;t done lately, which is only fitting for a blog called Elegant Coding, I think it came out pretty decent but remember I am still learning Scala and Clojure so my code examples here may not be as elegant as they could be.  I guess another objective of this post and my blog in general is to explore ways to mix programming and math education, while I think this post makes for a nice start along these lines, it could probably be improved which would be nice.&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2012/10/the-math-of-first-scala-assignment.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsWdZjh4fCBFO96QLmsQKoEY6OtgnfIkbyuOpXCycahtvwQh1qVXzVfa74utjD1rXdEAulvcgJQv1-JI7_V_w59a8HjPONwYcbud0O1X2TVq25cPo_wrgKJDCn9mSWHUJf20NkcokcXi-6/s72-c/crater.jpg" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-1154912453577523880</guid><pubDate>Mon, 08 Oct 2012 20:41:00 +0000</pubDate><atom:updated>2012-10-08T19:00:54.244-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Combinatorics</category><category domain="http://www.blogger.com/atom/ns#">Lattice Theory</category><category domain="http://www.blogger.com/atom/ns#">Math</category><category domain="http://www.blogger.com/atom/ns#">Number Theory</category><category domain="http://www.blogger.com/atom/ns#">Topology</category><title>The Ubiquitous Patterns of Pascal’s Triangle</title><description>&lt;!--The Ubiquitous Patterns of Pascal’s Triangle--&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpeQjn5FFFNCq3dbYJuL145L_Jo-aW7QTkJ5FEdeLMXcfQ__KzuEiGTLppw8P83ntQ47V9D3_l2peqqx6iy4PFlye6MeyE2ccsptbRTnavOwvdQ_LZDQu-NSWzVh_u3vQ4afAgeOk39WH/s1600/PascalsTriangleCoefficient.1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpeQjn5FFFNCq3dbYJuL145L_Jo-aW7QTkJ5FEdeLMXcfQ__KzuEiGTLppw8P83ntQ47V9D3_l2peqqx6iy4PFlye6MeyE2ccsptbRTnavOwvdQ_LZDQu-NSWzVh_u3vQ4afAgeOk39WH/s400/PascalsTriangleCoefficient.1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Pascal%27s_triangle&quot;&gt;Pascal’s Triangle&lt;/a&gt; is one of the most fascinating and intriguing objects in math, I was first introduced to it in the sterile context of high school algebra as an aside.  Only decades later did I discover its true grandeur when I rediscovered it in the context of &lt;a href=&quot;http://en.wikipedia.org/wiki/Combinatorics&quot;&gt;combinatorics&lt;/a&gt; and number theory.  I will attempt to provide some, hopefully, enlightening images but I feel that mathematical notation is both important and beautifully concise and allows one to have a transcendent experience with math so we will start with a formula, one of my “&lt;a href=&quot;http://www.elegantcoding.com/2011/11/eleven-equations-true-computer-science.html&quot;&gt;Eleven Equations&lt;/a&gt;”. The more I learn the more I feel it is more than justified to be in that list. I also feel that its centrality in combinatorics and probability theory makes it an equation that every math or computer science geek or enthusiast should be able to both recite off of the top their heads and be able to apply, if you don’t agree maybe this post will inspire you to think differently.  The equation is that of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Binomial_coefficient&quot;&gt;binomial coefficient formula&lt;/a&gt; and it describes each element of Pascal’s Triangle:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB_wg-XkRS9j_6_GOcIBPSyA7EekPZUW1o58Q4FB1JYZ7f1QC9r9ZtajTaBH1LSD2HDCToy1Rsu0ecDVjzk9HV-bL3Xj3bMniXwIaMfgr9xY6vagiFUlm9pcmMbi-7lA9r1USBABnlbtYq/s1600/Binomail+Coeffient.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;124&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgB_wg-XkRS9j_6_GOcIBPSyA7EekPZUW1o58Q4FB1JYZ7f1QC9r9ZtajTaBH1LSD2HDCToy1Rsu0ecDVjzk9HV-bL3Xj3bMniXwIaMfgr9xY6vagiFUlm9pcmMbi-7lA9r1USBABnlbtYq/s400/Binomail+Coeffient.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The above formula evaluates under the rules that c &amp;le; r,  r &amp;le; 0 and 0! = 1.  I prefer the use the letters r and c over the traditional n and k as in n chose k, one can as easily say r choose c.  The reason I prefer r and c is that r means row and c means column and these values can be viewed as a way to address positions within Pascal’s Triangle, for example using the binomial coefficient notation from the above formula Pascal’s Triangle can be represented as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglRTEykc4i4BqHffAuxWSbk-O-z4GGe3BqxqOlg2RfiJ23TrddalQLJ0JP6R-lwAuzGVP6c4y1EkT2LjnC__1CCUjNJl9WI7dZ5SyuhuONXar-KU8EWNLaxVIHUZoX3fDyxQ2IGjrW59rH/s1600/PascalsTriangleCoefficient.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;380&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglRTEykc4i4BqHffAuxWSbk-O-z4GGe3BqxqOlg2RfiJ23TrddalQLJ0JP6R-lwAuzGVP6c4y1EkT2LjnC__1CCUjNJl9WI7dZ5SyuhuONXar-KU8EWNLaxVIHUZoX3fDyxQ2IGjrW59rH/s400/PascalsTriangleCoefficient.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;As you can see in the above representation each position is the address (r,c) given by the coefficient notation.  Evaluating the expressions above with the Binomial Coefficient formula yields the more common representation of Pascal’s Triangle:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrvPHcX5jtnjykJuR1mPAcg2t8Z6lzENbm8TQwK3AFVBHs5Vmlr3TQVuAPey3CnPEg6HKAnwfjwgghw5206b2sDva6fcBz5-zhd734p2GHmN9ctpIPgWXX7pHvIKilqCE-zcqJ1t5Ifoob/s1600/pascalsTriangle.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;280&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrvPHcX5jtnjykJuR1mPAcg2t8Z6lzENbm8TQwK3AFVBHs5Vmlr3TQVuAPey3CnPEg6HKAnwfjwgghw5206b2sDva6fcBz5-zhd734p2GHmN9ctpIPgWXX7pHvIKilqCE-zcqJ1t5Ifoob/s400/pascalsTriangle.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Binomial_Theorem&quot;&gt;&lt;/a&gt;&lt;h3&gt;Binomial Theorem&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;If I recall correctly and has been a while, the high school algebra introduction to Pascal’s triangle was mostly tied to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Binomial_theorem&quot;&gt;Binomial Theorem&lt;/a&gt;, which is written with &lt;a href=&quot;http://en.wikipedia.org/wiki/Summation&quot;&gt;sigma (summation)&lt;/a&gt; notation as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv0G3lDE2NIY30Kq92dp3xM9DBHBsBiaX2KnHtkHzff2ltKh5J-Xzywgw2m6PNSsi8okgp0lvFf3U-NMr-2OyyRmSp6w8A5H4_6hK3Lt4mWqY_PqsXcR6w1CHYa5TH-P_Bddwr3nmvEPXx/s1600/binomial.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;47&quot; width=&quot;355&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhv0G3lDE2NIY30Kq92dp3xM9DBHBsBiaX2KnHtkHzff2ltKh5J-Xzywgw2m6PNSsi8okgp0lvFf3U-NMr-2OyyRmSp6w8A5H4_6hK3Lt4mWqY_PqsXcR6w1CHYa5TH-P_Bddwr3nmvEPXx/s400/binomial.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;For our purposes we are interested in the one variable version which can be written as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO9YxMQVBEsIRCLLdBvlptPF5_7iKRe4CYJ9HDDNukV31WwcRWi-ITCrg-1XnbaWMSsTHyZ7JaYTjuGUwAE5dKpLM_VFygQ90XEkMNyuYz71oxL-o9awXBIgUz-xgUi1P_cyzDafSE-c8r/s1600/binomial-one.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;47&quot; width=&quot;173&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO9YxMQVBEsIRCLLdBvlptPF5_7iKRe4CYJ9HDDNukV31WwcRWi-ITCrg-1XnbaWMSsTHyZ7JaYTjuGUwAE5dKpLM_VFygQ90XEkMNyuYz71oxL-o9awXBIgUz-xgUi1P_cyzDafSE-c8r/s400/binomial-one.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This can be expanded to:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VJaCPW5bpNqS1HVny572vvTid9SHIre5IMjJX43L6CHOXa_JQAZnTRq7L3wkqCAbFhaLSxKD7U0wZV3FvpAh6z9ukGdU7faahqc2E8Xl0nLJf8ne7PDPY6HCt2APqQp0rPmrda3y_yH3/s1600/binomial-one-expand.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;29&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1VJaCPW5bpNqS1HVny572vvTid9SHIre5IMjJX43L6CHOXa_JQAZnTRq7L3wkqCAbFhaLSxKD7U0wZV3FvpAh6z9ukGdU7faahqc2E8Xl0nLJf8ne7PDPY6HCt2APqQp0rPmrda3y_yH3/s400/binomial-one-expand.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This can be written in &quot;Pascal’s Triangle Form&quot; as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9FBYrgfsMWsLGEvGw3N_F07Fq5hsZMbDVClJcX4jWvqeaagm-XTyf5Nlwvn1v07X9HipxN7A1Lwc4j1qEESO9SxKSgGz0P0u5xTCbCjMvcHar8N3pGbvVk6zvcGYxWFbhsL_UCcUJT9Zy/s1600/pascal-binom-theo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;235&quot; width=&quot;373&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9FBYrgfsMWsLGEvGw3N_F07Fq5hsZMbDVClJcX4jWvqeaagm-XTyf5Nlwvn1v07X9HipxN7A1Lwc4j1qEESO9SxKSgGz0P0u5xTCbCjMvcHar8N3pGbvVk6zvcGYxWFbhsL_UCcUJT9Zy/s400/pascal-binom-theo.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Additive_Structure&quot;&gt;&lt;/a&gt;&lt;h3&gt;Additive Structure&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;These types of introductions often focus on the additive properties as well. Each element is the sum of the two elements above it, which can be illustrated as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqidwQtIsdrEfY4GxOIb0gdWA0OscMJa_yrCk_oV4xTSSJ5E8lD3H-XmtQge3lB_Gks6zLkAUrKcrGnZpF8Jtqgqd9e7snHn41JdeAYUjLB52StErySswAgBqu92bpJiKA2z5Jkk7T0Ze4/s1600/pascalsTriangleAddLattice.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;380&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqidwQtIsdrEfY4GxOIb0gdWA0OscMJa_yrCk_oV4xTSSJ5E8lD3H-XmtQge3lB_Gks6zLkAUrKcrGnZpF8Jtqgqd9e7snHn41JdeAYUjLB52StErySswAgBqu92bpJiKA2z5Jkk7T0Ze4/s400/pascalsTriangleAddLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The logic of this representation assumes that there is a zero on each side to add to propagate the ones on both side, we can rewrite this using the binomial coefficient notation as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJIjr1k9KaxAH_SBi5ybO-7PaxGBIDoMuvUgBW86iJuKlM71ZVFl4GMyagNVmniffKeAHcee32UPjcTdnLErOmcSeykHnQNB0Tw-IYZ7SgTOBLvGllQU9dLfaDhN148HGqtsTpCdfAz869/s1600/pascalsTriangleAddLatticeCoefficient.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJIjr1k9KaxAH_SBi5ybO-7PaxGBIDoMuvUgBW86iJuKlM71ZVFl4GMyagNVmniffKeAHcee32UPjcTdnLErOmcSeykHnQNB0Tw-IYZ7SgTOBLvGllQU9dLfaDhN148HGqtsTpCdfAz869/s400/pascalsTriangleAddLatticeCoefficient.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I admit this is where it starts to get more interesting to me. Not to denigrate its importance but I never really got that excited by the whole binomial theorem thing, although the &lt;a href=&quot;http://en.wikipedia.org/wiki/Binomial_theorem#Series_for_e&quot;&gt;series e&lt;/a&gt; stuff is pretty cool.  If we pick 5 choose 3 in the above representation, it can be written as the following sum:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdpCKg-b4jGd-uFzLvSaJJZxmDBX3Um5UycOdIUu6mYh8VpBp-zAfYeIhhPgNPB6z5vjm8JAZWRgG6O7WBN4alehTt-lQx2kPKub5USYV6JO9sxADibAdbRlYQ_9Qy8pqT-4Sw8R9xktbK/s1600/Pascal%2527s+Identity+5-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdpCKg-b4jGd-uFzLvSaJJZxmDBX3Um5UycOdIUu6mYh8VpBp-zAfYeIhhPgNPB6z5vjm8JAZWRgG6O7WBN4alehTt-lQx2kPKub5USYV6JO9sxADibAdbRlYQ_9Qy8pqT-4Sw8R9xktbK/s400/Pascal%2527s+Identity+5-3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Pascals_Identity&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;If you look at the above representation you can see that this can be done for all entries that have two parents, this can be generalized as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghYF8YsJofDXGl-2NaDXLEnAdESL9mINr0sxG-TvPj4DUXTQc7RPKhZUUQHQryUurTg-ppn0CnKZU1bYmbdwRRQmcGAvZmfutQa22HZtK5CLDfS42Nb__xbxvto9UvcBIbF2JAG_t7Lcf4/s1600/Pascal%2527s+Identity.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;191&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghYF8YsJofDXGl-2NaDXLEnAdESL9mINr0sxG-TvPj4DUXTQc7RPKhZUUQHQryUurTg-ppn0CnKZU1bYmbdwRRQmcGAvZmfutQa22HZtK5CLDfS42Nb__xbxvto9UvcBIbF2JAG_t7Lcf4/s400/Pascal%2527s+Identity.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This formula, which is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Recurrence_relation&quot;&gt;recurrence relation&lt;/a&gt;, is known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Pascal%27s_rule&quot;&gt;Pascal’s Identity&lt;/a&gt;, it is one of several formulas known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Binomial_coefficient#Identities_involving_binomial_coefficients&quot;&gt;Combinatorial Identities&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Powers_of_Two&quot;&gt;&lt;/a&gt;&lt;h3&gt;Powers of Two&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Another interesting and extremely important pattern in Pascal’s Triangle is the fact that the values of each row sum to the power of two of the row number, which the following representation depicts:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSqlzNdOsXupGiL4QOkEV2nv4JGZSz8LwEUeOCtc3WsShGGe1Yt-wkOnY9mP5ZvGInP68RyINyJdh9-OyfHUevlsknUeTOx40sUaNkCucbNYNeDd_zGcREPhowsjmbnqDKNJjDcNnCZtxK/s1600/pascalsTrianglePower2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;280&quot; width=&quot;360&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSqlzNdOsXupGiL4QOkEV2nv4JGZSz8LwEUeOCtc3WsShGGe1Yt-wkOnY9mP5ZvGInP68RyINyJdh9-OyfHUevlsknUeTOx40sUaNkCucbNYNeDd_zGcREPhowsjmbnqDKNJjDcNnCZtxK/s400/pascalsTrianglePower2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This can be written as the following formula, I think this also qualifies as an identity:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPb5dHDNyGQi_9yP7_uRThdziutPjUhxI5FgQyQOnmVQaz9AjaDnDT2TRi89polZtwlKDsdpefzUpROgo3fUnPF1jufPN4hKehyphenhyphenNz3Dz_KDhQ0RJ0RvEoN8OyZRIDcj0cSDEF2Lwa6-fpp/s1600/2r.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;47&quot; width=&quot;110&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPb5dHDNyGQi_9yP7_uRThdziutPjUhxI5FgQyQOnmVQaz9AjaDnDT2TRi89polZtwlKDsdpefzUpROgo3fUnPF1jufPN4hKehyphenhyphenNz3Dz_KDhQ0RJ0RvEoN8OyZRIDcj0cSDEF2Lwa6-fpp/s400/2r.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Sets&quot;&gt;&lt;/a&gt;&lt;h3&gt;Sets&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;As I mentioned at the beginning the binomial coefficient formula is read as r choose c.  I was trying to get back to that but I took the long way, so looking at our examples above our 5 choose 3 means if I have five things how many ways can I choose three of them which is 10 ways .  This is useful for counting, in combinatorics and probability theory I could take a deck of 52 cards and count how many 5 card hands I could choose and calculate probabilities of getting various hands, these are pretty standard applications of these types of counting problems.  However, if we step back and look at this counting, where each row represents a set of items, then each column represents the number of subsets of size c, this another reason I prefer c here it means both column and &lt;a href=&quot;http://en.wikipedia.org/wiki/Cardinality&quot;&gt;cardinality&lt;/a&gt; of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Subset&quot;&gt;subset&lt;/a&gt;.  We can create a representation of Pascal’s Triangle to show this, but it does become unwieldy pretty quickly due to the exponential growth of each row, we would get:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMVjOtT-peVu0qk2M_pe5WcGOLXY3fO31qY4BFwGOxLseFlq8sOqtnfxt9w08iS40re2K3rVThwKTBP722n4AcMsR9Xqx20yXTxYDpF5JjfHQh0AAoPcHGcil2gQ6NXw42BoJCf2yRiKqn/s1600/pascal-sets.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;340&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMVjOtT-peVu0qk2M_pe5WcGOLXY3fO31qY4BFwGOxLseFlq8sOqtnfxt9w08iS40re2K3rVThwKTBP722n4AcMsR9Xqx20yXTxYDpF5JjfHQh0AAoPcHGcil2gQ6NXw42BoJCf2yRiKqn/s400/pascal-sets.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;In this representation each number represents a set element, these can map to any sets with these cardinalities.  Each column is wrapped by parentheses.  The ones on the left are created by the empty set and the ones on the right are created by the set itself.  So each row in Pascal’s triangle gives the structure of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Power_set&quot;&gt;powerset&lt;/a&gt; of a set with the cardinality of the row number.  Also it is not a coincidence that each row sums to a power of two since the cardinality of the powerset is the cardinality of the set raised to the power of 2.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Powerset_Lattice&quot;&gt;&lt;/a&gt;&lt;h3&gt;Powerset Lattice&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Since I’ve had &lt;a href=&quot;http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html&quot;&gt;lattice theory on my mind lately&lt;/a&gt;, I couldn’t help but calling on our old friend the powerset lattice, as you can see in the context of the above each powerset lattice is going to have a row from Pascal’s triangle imprinted on it, each antichain consists of sets of the same cardinality and the number sets in the antichain maps back to a column:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAJTvi8Md7mCgw7td8PckDc08slIY_AqNvSrqtAPRo13ZskycDheQ0PE0W_5EA1Sxq54aZ_b6H-Lu6mKXd-QT55CwXRcRfkIspkZn43CHG4jewzqNTflQWAqaZUZ6TGyUj69drRJOgAvU6/s1600/PowerSetLattice.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;218&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAJTvi8Md7mCgw7td8PckDc08slIY_AqNvSrqtAPRo13ZskycDheQ0PE0W_5EA1Sxq54aZ_b6H-Lu6mKXd-QT55CwXRcRfkIspkZn43CHG4jewzqNTflQWAqaZUZ6TGyUj69drRJOgAvU6/s400/PowerSetLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;PIE&quot;&gt;&lt;/a&gt;&lt;h3&gt;Principle of Inclusion and Exclusion (P.I.E)&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The principle of inclusion and exclusion is used to count the size (cardinality) of a union of sets based on the cardinality of the sets and their intersections, the most common form, which appears in many probability texts, is:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;|A &amp;cup; B| = |A| + |B| - |A &amp;cap; B|&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The reason for this is that if you take the size of the union two sets, if they have any common elements then they counted twice, so subtracting the intersection removes the duplicate count.  This type of problem, counting things more than once and then needing to remove the duplicates comes up in other counting problems as well.  The venn diagram below shows the intersection of two sets, these are the elements that get counted twice in |A| + |B|:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXBgo8MTxjWjOBVX7nI8PtVUl9zXutvXkVdyRN8Peoa9HEjoJKImUPoFrv523inpxs2szJPSalvJZr-9CAQarOeyZBhfNh6BMKBre_e8xe9QGGYGBfCOuQGEi0zFmBSE_3EQdO9O-z5wot/s1600/200px-Venn0001_svg.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;146&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXBgo8MTxjWjOBVX7nI8PtVUl9zXutvXkVdyRN8Peoa9HEjoJKImUPoFrv523inpxs2szJPSalvJZr-9CAQarOeyZBhfNh6BMKBre_e8xe9QGGYGBfCOuQGEi0zFmBSE_3EQdO9O-z5wot/s400/200px-Venn0001_svg.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Now as a disclaimer this Pascal’s triangle correlation is strictly my own observation so it might be wrong, but it seems to hold.  If you take the formula from above and add a term for the empty set, which is not needed as it evaluates to zero you get |&amp;empty;| + |A| + |B| - |A &amp;cap; B|.  Now you can see the number of elements for each term with number of sets (0, 1, 2) are 1 2 1, row 2 of Pascal’s triangle, for three you have 1 3 3 1:&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;2&quot; cellpadding=&quot;0&quot;&gt;&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; colspan=&quot;2&quot;&gt;&lt;p&gt;|A &amp;cup; B &amp;cup; C| =&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;300&quot;&gt;&lt;p&gt;|&amp;empty;| +&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;300&quot;&gt;&lt;p&gt;|A| + |B| + |C|&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(3&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;300&quot;&gt;&lt;p&gt;- |A &amp;cap; B| - |A &amp;cap; C| - |B &amp;cap; C|&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(3&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;20&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;300&quot;&gt;&lt;p&gt;+ |A &amp;cap; B &amp;cap; C|&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(1&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;And for four we have (1 4 6 4 1)&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;2&quot; cellpadding=&quot;0&quot;&gt;&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; colspan=&quot;2&quot;&gt;&lt;p&gt;|A &amp;cup; B &amp;cup; C &amp;cup; D | =&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;400&quot;&gt;&lt;p&gt;|&amp;empty;| +&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;400&quot;&gt;&lt;p&gt;|A| + |B| + |C|+ |D|&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(4&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;400&quot;&gt;&lt;p&gt;- |A &amp;cap; B| - |A &amp;cap; C| - |A &amp;cap; D| - |B &amp;cap; C| - |B &amp;cap; D| - |C &amp;cap; D|&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(6&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;400&quot;&gt;&lt;p&gt;+ |A &amp;cap; B &amp;cap; C| + |A &amp;cap; B &amp;cap; D| + |A &amp;cap; C &amp;cap; D| + |B &amp;cap; C &amp;cap; D|&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(4&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot; width=&quot;400&quot;&gt;&lt;p&gt;- |A &amp;cap; B &amp;cap; C &amp;cap; D |&lt;/p&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;left&quot;&gt;(1&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;This does not prove it but I would bet the pattern continues.  Like I said this is my own observation, so it might be wrong, if you know either way please let me know.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Binomial_Distribution&quot;&gt;&lt;/a&gt;&lt;h3&gt;Binomial Distribution&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The binomial distribution is given by the following formula:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieHymyfLL2-Tqy7GCuSw9LtXrgBfId-5QMeUDDbANHkY-YXdAPT9QIKELnoiJjFz5yGaRdWHVk1K5ODFgOdf_LmN7fuWApabFmgmA_2bp2q7sN7DgAF-ZYM6Kvat8y1_HAZE1TVmkeT3L1/s1600/binomial-dist.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;319&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieHymyfLL2-Tqy7GCuSw9LtXrgBfId-5QMeUDDbANHkY-YXdAPT9QIKELnoiJjFz5yGaRdWHVk1K5ODFgOdf_LmN7fuWApabFmgmA_2bp2q7sN7DgAF-ZYM6Kvat8y1_HAZE1TVmkeT3L1/s400/binomial-dist.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I converted it to my r,c nomenclature, I may be going too far using it here but I wanted to keep consistent, remember r=n, and c=k.  It is a discrete probability distribution for the number of successes of r independent yes/no experiments each of which yields success with probability p. If you set p=1/2, the symmetric case, then the row number r divided by 2&lt;sup&gt;r&lt;/sup&gt; gives you the binomial distribution. By the &lt;a href=&quot;http://en.wikipedia.org/wiki/Central_limit_theorem&quot;&gt;central limit theorem&lt;/a&gt; this symmetric case approaches the normal distribution as r increases.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Central_Binomial_Coefficient_Symmetry&quot;&gt;&lt;/a&gt;&lt;h3&gt;Central Binomial Coefficient and Symmetry&lt;/h3&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVvGOBcYVqkT8KVUj8icGSVlbQdHKz15aX4mUAMa_Q8ysck82A1_IrLXfTEapwrdzfu3BvcKk9t20ETBDBvwtHRvdgyN7cZJtrPBmp_OAygfmCue96R-_83xw1ccHNqj-BlcOc0SowQOW5/s1600/pascalsTriangleSymmetry.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVvGOBcYVqkT8KVUj8icGSVlbQdHKz15aX4mUAMa_Q8ysck82A1_IrLXfTEapwrdzfu3BvcKk9t20ETBDBvwtHRvdgyN7cZJtrPBmp_OAygfmCue96R-_83xw1ccHNqj-BlcOc0SowQOW5/s400/pascalsTriangleSymmetry.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The above representation shows the symmetry in Pascal’s Triangle, each row is colored in a way that highlights the numbers that are the same, the first and last columns consisting of ones match each other obviously, but in each row the second column matches the second to last column, and the same for the third column and so one. This gives rise to, you guessed it, another combinatorial identity:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivAlfArXzttRu8aOAMtzCY8n7MO-ORKrVyP0UEmmMDto_8MyB75o7YWo3QF7ooMHWJFy5HyiYQTyyflt7DdQqY_-yLcYfscDM5HlAKP7Mm4lyAeUF6o02xHFJUGHnFmvDzVJEDVHUpWk_H/s1600/Binomial+Symetry.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;141&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivAlfArXzttRu8aOAMtzCY8n7MO-ORKrVyP0UEmmMDto_8MyB75o7YWo3QF7ooMHWJFy5HyiYQTyyflt7DdQqY_-yLcYfscDM5HlAKP7Mm4lyAeUF6o02xHFJUGHnFmvDzVJEDVHUpWk_H/s400/Binomial+Symetry.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The columns highlighted in the gray box are special case called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Central_binomial_coefficient&quot;&gt;central binomial coefficient&lt;/a&gt;. If you notice each even numbered row has an odd number of columns with the central one only occurring only once, it still follows the above identity but the identity evaluates to a value equaling itself.  The central binomial coefficient is given by the following form, I use n here since we don’t care about row/column in this case:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH3OuUv43b6d3appUPfOGDP-8ARPJ-r-FogGN_zRLqbZOk8MpkDCHqaJnbw1lJtZ5Lb0GSEpvR0QAmO8zSDZLbr8yBMh1N709vetjCMQTnkW_rNcofwnD2pr2y03MQcQ0PiZwn5AacFVmc/s1600/Central+Binomial.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;53&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjH3OuUv43b6d3appUPfOGDP-8ARPJ-r-FogGN_zRLqbZOk8MpkDCHqaJnbw1lJtZ5Lb0GSEpvR0QAmO8zSDZLbr8yBMh1N709vetjCMQTnkW_rNcofwnD2pr2y03MQcQ0PiZwn5AacFVmc/s400/Central+Binomial.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Figurate_Numbers&quot;&gt;&lt;/a&gt;&lt;h3&gt;Figurate Numbers&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;There is an area of math that deals with &lt;a href=&quot;http://en.wikipedia.org/wiki/Figurate_number&quot;&gt;figurate numbers&lt;/a&gt;, these are numbers formed by arranging dots to form various polygons which form sequences as you expand size of each polygon, I looked at some interesting properties of &lt;a href=&quot;http://www.elegantcoding.com/2011/07/triangles-triangular-numbers-and.html&quot;&gt;triangular numbers in a previous post&lt;/a&gt;, for example here are the first 5 triangular numbers:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidmsE8Heq8NntvEILzJlV-_hoeKPOCfYyVNa5UoKH7HzKDK3zIhgDzg0qMM9SqsuTEEFxVqZXgeAsPnSJ11DiMsMx-ZRUrr6fBoQESFtCiLKJmYdlCAjC9PThxAzF1qaFWR4_QCOlEmj1_/s1600/trinum.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;250&quot; width=&quot;280&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidmsE8Heq8NntvEILzJlV-_hoeKPOCfYyVNa5UoKH7HzKDK3zIhgDzg0qMM9SqsuTEEFxVqZXgeAsPnSJ11DiMsMx-ZRUrr6fBoQESFtCiLKJmYdlCAjC9PThxAzF1qaFWR4_QCOlEmj1_/s400/trinum.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Triangular numbers are created by adding up the natural numbers, but there is a binomial formula which evaluates to a closed formula:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh52ZKSqSMyaePIne_QDcJ2_geB-Jjsn275YkB0VikUiI8sIZwywHMtfIEqYzqtRnWXO40yGEaA5FfhUihehv2uR9LtmduFZS_fJOqo1bMs1jMIQjiLs7qjrjKmzGXU1Nc706fThxLKK07H/s1600/trinum.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;44&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh52ZKSqSMyaePIne_QDcJ2_geB-Jjsn275YkB0VikUiI8sIZwywHMtfIEqYzqtRnWXO40yGEaA5FfhUihehv2uR9LtmduFZS_fJOqo1bMs1jMIQjiLs7qjrjKmzGXU1Nc706fThxLKK07H/s400/trinum.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The idea of figurate numbers can be extended into higher dimensions, so not only do you have numbers that create polygons you can create polyhedrons as well.  When you add up triangular numbers, you get the &lt;a href=&quot;http://en.wikipedia.org/wiki/Tetrahedral_number&quot;&gt;tetrahedral number&lt;/a&gt; which can be described by an analogous formula:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht9zL2yNhukSXF8lwmyeFpjjXgAVE-cYsguqgM9Xx-3eOr_XL7BMFoSyq-JQibdIXQfGrQrWrmg6SpWVWbub17z67XKlDDmFtyijH8jldNbPXu36Q2oc7CfSEmPpqkwDBkgqY2ys5JaCv5/s1600/tetranum.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;37&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht9zL2yNhukSXF8lwmyeFpjjXgAVE-cYsguqgM9Xx-3eOr_XL7BMFoSyq-JQibdIXQfGrQrWrmg6SpWVWbub17z67XKlDDmFtyijH8jldNbPXu36Q2oc7CfSEmPpqkwDBkgqY2ys5JaCv5/s400/tetranum.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This can be visually depicted as stacking up the triangular number to form tetrahedrons:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtypvaLo-zUvwwzh1Q49vgwawNauW2XIC5yUSm9udk7Q-4ieEVnOx3ySmmCbgVq4eEMGdsahzLItSeSrirtHovOwsmktWK-OPcIMmox4K-opVoRD80XPdOjcG6IuixFvcXBGTn1SPVq815/s1600/tetranum.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;160&quot; width=&quot;389&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtypvaLo-zUvwwzh1Q49vgwawNauW2XIC5yUSm9udk7Q-4ieEVnOx3ySmmCbgVq4eEMGdsahzLItSeSrirtHovOwsmktWK-OPcIMmox4K-opVoRD80XPdOjcG6IuixFvcXBGTn1SPVq815/s400/tetranum.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Pascal’s Triangle has a number of relations with figurate numbers, but the most notable are the triangular and tetrahedral numbers, shown in red and blue respectively:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixEHl8vh2VDJh4kNAZsFOfg5Mdi_P-AubvhA2V8S4EHYJn_zQyVT1tFat7QHb55kEDy7HC4sqR77BoQyvh05tvzmn5b0nL1wmmdf_n-ySPOQiI4J_jmNlc9zhOMDD-I4mZYazmk6YhVcB7/s1600/pascalsTriangleTetrahedral.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixEHl8vh2VDJh4kNAZsFOfg5Mdi_P-AubvhA2V8S4EHYJn_zQyVT1tFat7QHb55kEDy7HC4sqR77BoQyvh05tvzmn5b0nL1wmmdf_n-ySPOQiI4J_jmNlc9zhOMDD-I4mZYazmk6YhVcB7/s400/pascalsTriangleTetrahedral.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Also if you look at the binomial expression for these you will notice that the column is fixed, for triangular numbers it is c=2 and for tetrahedral numbers it is c=3, this maps our addressable form to the second and third columns as shown.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibhMBvdG8Nt1DhdBu0edmI1v3igDJerY9wLHUBkF1gm3iogoKpsk-qehyphenhyphenBDnm9u0Fy0_Uib5Wv7i5q5Vr8dlCXs_CETWXHINcxkZ2sE3B9H19_pHt_GQYgbat3IoNnPeyhtFos6Q0dxtc4/s1600/pascalsTriangleTable.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;226&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibhMBvdG8Nt1DhdBu0edmI1v3igDJerY9wLHUBkF1gm3iogoKpsk-qehyphenhyphenBDnm9u0Fy0_Uib5Wv7i5q5Vr8dlCXs_CETWXHINcxkZ2sE3B9H19_pHt_GQYgbat3IoNnPeyhtFos6Q0dxtc4/s400/pascalsTriangleTable.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The above tabular form is based on a table from &lt;u&gt;Concrete Mathematics&lt;/u&gt;, 2nd Edition by Ronald L. Graham, Donald E. Knuth and Oren Patashnik.  Again you can see column one, where c=1, is the natural numbers, column two is the trianglular numbers, the summation of natural numbers and three is the tetrahedral numbers, the summation of the triangular numbers.  This would imply that this pattern continues to progress, and it does. The next column are the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pentatope_number&quot;&gt;pentatope numbers&lt;/a&gt;, which describe a series of four dimensional polytopes, a &lt;a href=&quot;http://en.wikipedia.org/wiki/Polytope&quot;&gt;polytope&lt;/a&gt; is an extension of a polyhedron into higher dimensions, called &lt;a href=&quot;http://en.wikipedia.org/wiki/Pentachoron&quot;&gt;pentachorons&lt;/a&gt; which are formed by stacking three dimensional tetrahedrons in four dimensions. These numbers are given by the formula:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg37hG_BLIDyMt482dnbRg5VvzocEcIqzQjtoWrfoiLnsShpHSLAx1eki9Kex8j4P_c1_e_5EiwN9Vd_8txToXkLBkafm_PNuAGh3N4oPfGCOO_SZd0IdUf1MW89A6hsUcs1kdHiTonv1eI/s1600/pentatopenum.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;33&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg37hG_BLIDyMt482dnbRg5VvzocEcIqzQjtoWrfoiLnsShpHSLAx1eki9Kex8j4P_c1_e_5EiwN9Vd_8txToXkLBkafm_PNuAGh3N4oPfGCOO_SZd0IdUf1MW89A6hsUcs1kdHiTonv1eI/s400/pentatopenum.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;And these numbers progress into higher dimensions, each summing the numbers immediately below them. These are generalized as the &lt;a href=&quot;http://blog.drscottfranklin.net/2006/10/26/multi-dimensional-pyramidal-numbers/&quot;&gt;pyramidal numbers&lt;/a&gt; and are described by the following table:&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;Number&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;Summation Form&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;Binomial Form&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;Closed Form&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtGGDQHd6lSY49t7MwYzAbr94COIujXjF8GAqVl4nLfL7Bds4WXGGHqjrGCwJs8T-qHR6nrHinFrXFGIRIl0-9NkrKjhT4pnMyjVKh_XohzkxbGG-95cX60m1tvNA1IXqSCHgBZgS55NiY/s1600/P0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtGGDQHd6lSY49t7MwYzAbr94COIujXjF8GAqVl4nLfL7Bds4WXGGHqjrGCwJs8T-qHR6nrHinFrXFGIRIl0-9NkrKjhT4pnMyjVKh_XohzkxbGG-95cX60m1tvNA1IXqSCHgBZgS55NiY/s400/P0.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim65dl181lfZw_Zi19fzk2RMwvEbTtaPdZVcm7AK3KDKaaC_OKIreMMLjdsDlzp4qvK6DZRz16-LGcwa8mZdWY9LbB3o8bV0Y9RirAX1q6vpB-R-N8WRUysCxRwH6R3ZcL4WDBRJqHJ04n/s1600/Sum-0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;49&quot; width=&quot;33&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim65dl181lfZw_Zi19fzk2RMwvEbTtaPdZVcm7AK3KDKaaC_OKIreMMLjdsDlzp4qvK6DZRz16-LGcwa8mZdWY9LbB3o8bV0Y9RirAX1q6vpB-R-N8WRUysCxRwH6R3ZcL4WDBRJqHJ04n/s400/Sum-0.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbzwYdvjygdV5c4Ost_vaqrgkavrllBfmSWI6FWcDV4mfdBgJpQ4iczgiGmY7Sg-cSUgwS1lR0Cd_8fhgKq_rPCFltRTVdECQ22jqg9FEbhbXbZJtI4rUOdqPYScZfDAN1iJM7n_9GHGSG/s1600/BinomialForm0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;43&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbzwYdvjygdV5c4Ost_vaqrgkavrllBfmSWI6FWcDV4mfdBgJpQ4iczgiGmY7Sg-cSUgwS1lR0Cd_8fhgKq_rPCFltRTVdECQ22jqg9FEbhbXbZJtI4rUOdqPYScZfDAN1iJM7n_9GHGSG/s400/BinomialForm0.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmk5R4MwNrxitKz9-tupam7fHRO_dZoKWgVgdxyB5s79iBKYrdrRMe4HFO3GNkenliynntQeBiRhZ4XYTsJ4GVbmbEyz9f-7n8viU1civrb6LwL_tpdB2LsJUUhBM-KgFlV9DSJljYO_UR/s1600/Closed-0.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;35&quot; width=&quot;13&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmk5R4MwNrxitKz9-tupam7fHRO_dZoKWgVgdxyB5s79iBKYrdrRMe4HFO3GNkenliynntQeBiRhZ4XYTsJ4GVbmbEyz9f-7n8viU1civrb6LwL_tpdB2LsJUUhBM-KgFlV9DSJljYO_UR/s400/Closed-0.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO62_2OEwtnKxQ7VwkJWRwbZlIHRQ3VhJy0vF0dgzFm7eqBkrR16YLa2uQ_kzVASL0OGLNLDUWE1GQwGtbdyTGrcb9F_B2uG-z5z0IlILHY_4EzWIGl1_RR9JmBUm2klrNhoiH6e2fjdyv/s1600/P1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO62_2OEwtnKxQ7VwkJWRwbZlIHRQ3VhJy0vF0dgzFm7eqBkrR16YLa2uQ_kzVASL0OGLNLDUWE1GQwGtbdyTGrcb9F_B2uG-z5z0IlILHY_4EzWIGl1_RR9JmBUm2klrNhoiH6e2fjdyv/s400/P1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFvMk4fyXcjiDCyWeFlDnKH15hUXlNZ_sjNCKiSxaZJO5WSiaBBa1cDe5bnzPYJf7NyqlcrHNhZVo11drAqEL6xtEQl0D0BiR9pcuB3kDGbID8hQ5HYwhM-5sZmpBbUKep5vG78z7tEjX/s1600/Sum-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;46&quot; width=&quot;33&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNFvMk4fyXcjiDCyWeFlDnKH15hUXlNZ_sjNCKiSxaZJO5WSiaBBa1cDe5bnzPYJf7NyqlcrHNhZVo11drAqEL6xtEQl0D0BiR9pcuB3kDGbID8hQ5HYwhM-5sZmpBbUKep5vG78z7tEjX/s400/Sum-1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN4Zn1QcSJwH5X1qEO6GT6h1R8HhpuIh6IHx04P9dqBeoHRAuCBUGBWZxR_bZY3N4grY_cuJNBFORftBzkZz16-uAxvldxH-LUZERJ8Z-1wGh4BQhjN_Y9m7LOSL1AHxkMZQZdGTnL3vsk/s1600/BinomialForm1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;45&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN4Zn1QcSJwH5X1qEO6GT6h1R8HhpuIh6IHx04P9dqBeoHRAuCBUGBWZxR_bZY3N4grY_cuJNBFORftBzkZz16-uAxvldxH-LUZERJ8Z-1wGh4BQhjN_Y9m7LOSL1AHxkMZQZdGTnL3vsk/s400/BinomialForm1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJOLCw-hNWSiFwLQ0Omb1A5hO5Cv7bgksfclq1pz0dmUZBOf8D-uv8XYG-yMjp_sCNiEq7Pl2xINl_KLuZWUJTgSE2dT4KPDVsimAXUSdNqbTZ2jC_8vZAvfINs8a4wzD0CrBZtxWh5bhU/s1600/Closed-1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;31&quot; width=&quot;13&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJOLCw-hNWSiFwLQ0Omb1A5hO5Cv7bgksfclq1pz0dmUZBOf8D-uv8XYG-yMjp_sCNiEq7Pl2xINl_KLuZWUJTgSE2dT4KPDVsimAXUSdNqbTZ2jC_8vZAvfINs8a4wzD0CrBZtxWh5bhU/s400/Closed-1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrIfu0OxFUF1-EeOgi_mRpiwhbUuOjtK6KA2U3hN0DR_rS1ODwgI6o9Ep09zzoaUjKMsfB9JImjE-C8w6AaT16QqlData3jzOfrlmQ-XJmDXFYTaiwSrujmSX-RGedXca8uWW4bQ2CA3tp/s1600/P2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrIfu0OxFUF1-EeOgi_mRpiwhbUuOjtK6KA2U3hN0DR_rS1ODwgI6o9Ep09zzoaUjKMsfB9JImjE-C8w6AaT16QqlData3jzOfrlmQ-XJmDXFYTaiwSrujmSX-RGedXca8uWW4bQ2CA3tp/s400/P2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirnB2c_Ie_qeZh6wKjOgBK_tgQdUyeFvJJFRj6XdoqwRo8xv1fj_tKjWSKvA6tlJqonL7yAniIGvXadTcthT9xT4q7OvgPlpVkwguulfa-yOE0sEH8fvlYyhqMCt7M_LcmkPZLiK1g_gRc/s1600/Sum-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;46&quot; width=&quot;54&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirnB2c_Ie_qeZh6wKjOgBK_tgQdUyeFvJJFRj6XdoqwRo8xv1fj_tKjWSKvA6tlJqonL7yAniIGvXadTcthT9xT4q7OvgPlpVkwguulfa-yOE0sEH8fvlYyhqMCt7M_LcmkPZLiK1g_gRc/s400/Sum-2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQLbt9a2WGjXZeFfXoHXzfdP3kWmdMModScUNQvejDnR4IPSF1JoGb7Ho7xAa2rRTnaYD8rfHCySb2LVCIfd0NhNgF32P6wVzzrJtMtzltEOzYWl-r22GAZkU7fzIgas__4z6Cae8xuOxP/s1600/BinomialForm2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;73&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQLbt9a2WGjXZeFfXoHXzfdP3kWmdMModScUNQvejDnR4IPSF1JoGb7Ho7xAa2rRTnaYD8rfHCySb2LVCIfd0NhNgF32P6wVzzrJtMtzltEOzYWl-r22GAZkU7fzIgas__4z6Cae8xuOxP/s400/BinomialForm2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6vZIOOWDZuhnVvQkTgzBHm77uVChif60svA0KK2gmJe46QNfNmpppmvt979BZJBrFkoBjr2-YuBL5hzn2sJE87GtmXic28ZslFd8xdYFjBik_Q4Vjc1-oGauHHYMbI8KRHAIXp-VDiki/s1600/Closed-2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;35&quot; width=&quot;62&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht6vZIOOWDZuhnVvQkTgzBHm77uVChif60svA0KK2gmJe46QNfNmpppmvt979BZJBrFkoBjr2-YuBL5hzn2sJE87GtmXic28ZslFd8xdYFjBik_Q4Vjc1-oGauHHYMbI8KRHAIXp-VDiki/s400/Closed-2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKavtM6GO-FVHjdxsXJkIm1n1ncwFW0yi8wR6tyNfHT60Y7J4Iz42pSY1ac01zIVNzckCP5CrSYetW4kE8ps1sw9Tr4Bl7vtCun_LIW8YurHxG7GQMfyo_bduZ05fWsFKjauNtSn5MEzRe/s1600/P3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKavtM6GO-FVHjdxsXJkIm1n1ncwFW0yi8wR6tyNfHT60Y7J4Iz42pSY1ac01zIVNzckCP5CrSYetW4kE8ps1sw9Tr4Bl7vtCun_LIW8YurHxG7GQMfyo_bduZ05fWsFKjauNtSn5MEzRe/s400/P3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW6MBqVKd5Nqpr8irp2LKJb_pftoYQA-VmNYBOQ-v89drzuzxP-uu_OVlnonoGvNpAZV_VeQRCC7NWbYXGwVETN1PUIDzZj4Ctj86QyBETQQY14SEBv8mcgx0XWsBbOf4-VNM58Q-Cpnu9/s1600/Sum-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;46&quot; width=&quot;54&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW6MBqVKd5Nqpr8irp2LKJb_pftoYQA-VmNYBOQ-v89drzuzxP-uu_OVlnonoGvNpAZV_VeQRCC7NWbYXGwVETN1PUIDzZj4Ctj86QyBETQQY14SEBv8mcgx0XWsBbOf4-VNM58Q-Cpnu9/s400/Sum-3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPRWb-u80mnwPEJGSJnXuVMEixzd5PH5BGWrRaBkf95pDIhDqF2y2o0UKW7DVVmF7DUVId5-v4AKTxl8FZe0CZmzLQFSCBd8xtIypy2h-1zGhyC9ViJeQnsGRcKf6YsYZ2BxNK-3QNlBlG/s1600/BinomialForm3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;73&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPRWb-u80mnwPEJGSJnXuVMEixzd5PH5BGWrRaBkf95pDIhDqF2y2o0UKW7DVVmF7DUVId5-v4AKTxl8FZe0CZmzLQFSCBd8xtIypy2h-1zGhyC9ViJeQnsGRcKf6YsYZ2BxNK-3QNlBlG/s400/BinomialForm3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxc7mn8WobpgjehYUATJB7LmG6ArWdtyB4vOOm9xx6-3P30EFo1K04WzCO6WVrxxbzO8LnNRdIF3yUgqZfhMvoMOpONIIFXqYvZ_5DaS7Yl0n3UaURN0tF1jtfUknpbwe7qPM82kWyEVJ/s1600/Closed-3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;36&quot; width=&quot;113&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxc7mn8WobpgjehYUATJB7LmG6ArWdtyB4vOOm9xx6-3P30EFo1K04WzCO6WVrxxbzO8LnNRdIF3yUgqZfhMvoMOpONIIFXqYvZ_5DaS7Yl0n3UaURN0tF1jtfUknpbwe7qPM82kWyEVJ/s400/Closed-3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglrptyfT9YC3nSYmqSVqncqECEV-v84i65cE5Jeyj-_uxPMJOnskzM-MMrjxK1FgkW1mIzUeA1QpL-ZIZ0d6wdCYpqnYWFapL_uSZp7cYDCbSYjxNCoIbhYK9t0gTVMLfQCztJ6_6Xc0TQ/s1600/P4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglrptyfT9YC3nSYmqSVqncqECEV-v84i65cE5Jeyj-_uxPMJOnskzM-MMrjxK1FgkW1mIzUeA1QpL-ZIZ0d6wdCYpqnYWFapL_uSZp7cYDCbSYjxNCoIbhYK9t0gTVMLfQCztJ6_6Xc0TQ/s400/P4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj_nGq4a3nm2L0yOXNAVRTj1PknzzeXNbS3kuzAMdW4WbubW-zlRrAqMKc6aLP6qpXWqGedu9OBfa1uLWrZTupIoboBBr50Kysb0CJIAFRhkaCdlrido-qd-jECXsUTqUm-ze8oBR8IpI7/s1600/Sum-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;46&quot; width=&quot;54&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhj_nGq4a3nm2L0yOXNAVRTj1PknzzeXNbS3kuzAMdW4WbubW-zlRrAqMKc6aLP6qpXWqGedu9OBfa1uLWrZTupIoboBBr50Kysb0CJIAFRhkaCdlrido-qd-jECXsUTqUm-ze8oBR8IpI7/s400/Sum-4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrb5r6WgyhOmxJ7ljlrHTYBW5WFhd3ZR2vuItzKiuE41ssdjOv0LVlwb-_LRffUgpAu5qXD6_NJxTle49_l3eDDOgRj9H9LpLORK77EMgHOLrg3RI2F9mh4QFIYf74ICiiSetbpXFGkiI/s1600/BinomialForm4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;73&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvrb5r6WgyhOmxJ7ljlrHTYBW5WFhd3ZR2vuItzKiuE41ssdjOv0LVlwb-_LRffUgpAu5qXD6_NJxTle49_l3eDDOgRj9H9LpLORK77EMgHOLrg3RI2F9mh4QFIYf74ICiiSetbpXFGkiI/s400/BinomialForm4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td valign=&quot;center&quot; align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVNiv9wdL1dqXX4k9mR_Y-99CQAdYK29uDwyEZuA0c8Y4We4g4T3thxn4wUILX0GNgG1abJjkjG2cFAY_EbcD0XkXt2gaY7LOdUgcj8Y9PqfnXpnMCKayNyfBSzsdvJelxHHgcxXsdWb90/s1600/Closed-4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;35&quot; width=&quot;165&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVNiv9wdL1dqXX4k9mR_Y-99CQAdYK29uDwyEZuA0c8Y4We4g4T3thxn4wUILX0GNgG1abJjkjG2cFAY_EbcD0XkXt2gaY7LOdUgcj8Y9PqfnXpnMCKayNyfBSzsdvJelxHHgcxXsdWb90/s400/Closed-4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-CSZfi2hPEQYla7nyG-nsefzGaLVYKmTUi1EVB-N7UTrLY6bdwvg0ESf_RJFQnYALY5_ScNnXkWtFY_vLgjQF8dFQuSTh9eW4p5U14frZbrLuBrUpHdWhn5Lg9sJePkbNguMA60d4je2d/s1600/Pc.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;20&quot; width=&quot;28&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-CSZfi2hPEQYla7nyG-nsefzGaLVYKmTUi1EVB-N7UTrLY6bdwvg0ESf_RJFQnYALY5_ScNnXkWtFY_vLgjQF8dFQuSTh9eW4p5U14frZbrLuBrUpHdWhn5Lg9sJePkbNguMA60d4je2d/s400/Pc.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCqEgcZvpSBm6eOpZINag1j2ocr8xGISg6SyStzW14Tj_T3P-GcTkxrx3M1eSyXQeYfe9Nm2FyNgpYqQobapHPyaMN76kLOpeIJ43-Ok_nbBYKtxXRPUIahQDmE1o00O7F_vcbIikVIA_Q/s1600/sum-c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;46&quot; width=&quot;71&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCqEgcZvpSBm6eOpZINag1j2ocr8xGISg6SyStzW14Tj_T3P-GcTkxrx3M1eSyXQeYfe9Nm2FyNgpYqQobapHPyaMN76kLOpeIJ43-Ok_nbBYKtxXRPUIahQDmE1o00O7F_vcbIikVIA_Q/s400/sum-c.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7gTM3aCsudYkwABQYGz5Y52Jj62qIvDLyv-7jliZ3vZi_4bf97qOfuxBrH78Jpjqoe663Dc39kf2kdepkVjxXccpbE8QD-5LNMcZv6xBNa8AtqBIjHeeCwY5lQYy8j4WE0AlwodskRGBP/s1600/BinomialFormc.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;101&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7gTM3aCsudYkwABQYGz5Y52Jj62qIvDLyv-7jliZ3vZi_4bf97qOfuxBrH78Jpjqoe663Dc39kf2kdepkVjxXccpbE8QD-5LNMcZv6xBNa8AtqBIjHeeCwY5lQYy8j4WE0AlwodskRGBP/s400/BinomialFormc.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;     &lt;td align=&quot;center&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrqqJWOwZ_3Ohc8IeLQL2FuXRD0s3iJDP0-9n7QkP_IqEwoU61G-_IrbTEt_rB6DEUFHwxHa1YiqnnhajnCADsZ71AnSJLUDiAPGMd-yu5wQfiP0bElL1Z3X9ZPaq6e4vog-HodNTBtNN/s1600/Closed-c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;36&quot; width=&quot;221&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQrqqJWOwZ_3Ohc8IeLQL2FuXRD0s3iJDP0-9n7QkP_IqEwoU61G-_IrbTEt_rB6DEUFHwxHa1YiqnnhajnCADsZ71AnSJLUDiAPGMd-yu5wQfiP0bElL1Z3X9ZPaq6e4vog-HodNTBtNN/s400/Closed-c.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;a name=&quot;Powers_of_Eleven&quot;&gt;&lt;/a&gt;&lt;h3&gt;Powers of Eleven&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;There is another interesting pattern in Pascal’s Triangle each successive row is equivalent to a power eleven of as you can see in the following table:&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tr&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;0&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;sup&gt;0&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;sup&gt;2&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;121&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;sup&gt;3&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;1331&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;sup&gt;4&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;14641&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;11&lt;sup&gt;5&lt;/sup&gt;&lt;/p&gt;&lt;/td&gt;     &lt;td width=&quot;106&quot; align=&quot;center&quot;&gt;&lt;p&gt;161051&lt;/p&gt;&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;Oops, I fibbed a little here, 11&lt;sup&gt;5&lt;/sup&gt; does not equal the row (1 5 10 10 5 1), this breaks down due to the need to carry 1 to make ten. However, the pattern will hold if you push up the number base, for example 11 hexadecimal, which I will write as 11&lt;sub&gt;16&lt;/sub&gt;, to the 5&lt;sup&gt;th&lt;/sup&gt; power is (11&lt;sub&gt;16&lt;/sub&gt;)&lt;sup&gt;5&lt;/sup&gt; = 15AA51, remember A equals 10 so now the pattern holds, and it will continue to hold as long as you keep upping the number base, but remember (11&lt;sub&gt;16&lt;/sub&gt;)&lt;sup&gt;5&lt;/sup&gt;&amp;ne; 11&lt;sup&gt;5&lt;/sup&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Sierpinski_Triangle&quot;&gt;&lt;/a&gt;&lt;h3&gt;Sierpinski Triangle&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;There is another interesting relation to another mathematically interesting triangle, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Sierpinski_triangle&quot;&gt;Sierpinski Triangle&lt;/a&gt; aka Sierpinski gasket is a fractal that can be constructed by taking an equilateral triangle and removing the center which is an equilateral triangle of ¼ area and then repeating this on each of the three remaining triangles, and so on.  It can also be created by applying modulo 2 to each element in Pascal’s Triangle as shown below. The zeros are grayed out to highlight the pattern:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZStMTIKnkIwMq3LZ6kFpqpwZtpNh2UFEqstzfv6M0KoeEmLbXPmarbh30oQb-Kqqhi3ety2rDqjv79WgEnj6sMCmTN3PM3Shlo66AxGlLCHRsqhXp8B3N_W1eGZwfWiQpHYrPUAPbn84q/s1600/PascalsTriangleSierpinski.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZStMTIKnkIwMq3LZ6kFpqpwZtpNh2UFEqstzfv6M0KoeEmLbXPmarbh30oQb-Kqqhi3ety2rDqjv79WgEnj6sMCmTN3PM3Shlo66AxGlLCHRsqhXp8B3N_W1eGZwfWiQpHYrPUAPbn84q/s400/PascalsTriangleSierpinski.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;h3&gt;And the List Goes On...&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;As we saw we ventured into several areas of mathematics, combinatorics, number theory, probability theory, fractal geometry and geometry (topology), and lattice theory.  There are many other patterns such as relations to polytopes, cellular automata, a pattern with prime numbers and more.  The &lt;a href=&quot;http://en.wikipedia.org/wiki/Pascal%27s_triangle&quot;&gt;Wikipedia page&lt;/a&gt; has many interesting patterns, some of which I used here also two other interesting sites are &lt;a href=&quot;http://christopherolah.wordpress.com/2011/08/29/understanding-pascals-triangle/&quot;&gt;Christopher Olah’s post&lt;/a&gt; and &lt;a href=&quot;http://ptri1.tripod.com/&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/10/the-ubiquitous-patterns-of-pascals.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhpeQjn5FFFNCq3dbYJuL145L_Jo-aW7QTkJ5FEdeLMXcfQ__KzuEiGTLppw8P83ntQ47V9D3_l2peqqx6iy4PFlye6MeyE2ccsptbRTnavOwvdQ_LZDQu-NSWzVh_u3vQ4afAgeOk39WH/s72-c/PascalsTriangleCoefficient.1.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-651673498477927413</guid><pubDate>Tue, 18 Sep 2012 14:38:00 +0000</pubDate><atom:updated>2012-11-09T09:53:38.926-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Abstract Algebra</category><category domain="http://www.blogger.com/atom/ns#">Lattice Theory</category><category domain="http://www.blogger.com/atom/ns#">Math</category><category domain="http://www.blogger.com/atom/ns#">Order Theory</category><category domain="http://www.blogger.com/atom/ns#">Set Theory</category><title>Lattice Theory for Programmers and Non Computer Scientists</title><description>&lt;!-- Lattice Theory for Programmers and Non Computer Scientists--&gt;&lt;br /&gt;
&lt;h2&gt;Part One: Mathematical Foundations&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-G0o_LMo9saE_POQ1N2b4XT-2MOllZYUcbM629gvp1VQErjZFYfuIw5gK-WTIHpfveW_7oIChRVftMbKQw763xerear6oeel5PiyiRiGwmwBTy13h-eABAxFiIwt2xzwCv4MfxMqZWZvC/s1600/monarch.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;316&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-G0o_LMo9saE_POQ1N2b4XT-2MOllZYUcbM629gvp1VQErjZFYfuIw5gK-WTIHpfveW_7oIChRVftMbKQw763xerear6oeel5PiyiRiGwmwBTy13h-eABAxFiIwt2xzwCv4MfxMqZWZvC/s400/monarch.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
    div.source-code {
        color             : #000;
        background-color  : #eee;
        border            : 1px dashed #999999;
        line-height       : 14px;
        padding           : 5px;
        overflow          : auto;
        width             : 100%;
        text-indent       : 0px;
        margin-top        : 8px;
        margin-bottom     : 8px;
    }
&lt;/style&gt;&lt;br /&gt;
&lt;p&gt;Matt Might has a blog post &quot;&lt;a href=&quot;http://matt.might.net/articles/partial-orders/&quot;&gt;Order Theory for Computer Scientists&lt;/a&gt;&quot; in which he concisely outlines some basics of order theory.  It is a nice post but it is targeted towards computer scientists and is possibly only of interest to that audience, especially since all of his examples are in &lt;a href=&quot;learnyouahaskell.com&quot;&gt;Haskell&lt;/a&gt;, not that there is anything wrong with that, but I think this is unfortunate as these ideas are potentially interesting to programmers as well.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In this post I am mostly talking about &lt;a href=&quot;http://en.wikipedia.org/wiki/Lattice_%28order%29&quot;&gt;lattice theory&lt;/a&gt; as opposed to the more general &lt;a href=&quot;http://en.wikipedia.org/wiki/Lattice_%28order%29&quot;&gt;order theory&lt;/a&gt;.  While general order theory is both interesting and relevant to programming and CS, lattice theory is too and there are many interesting ideas that relate to lattice theory. Lattices impose more structure on orders and that is probably why there are a lot of books on lattice theory such as &lt;a href=&quot;http://server.maths.umanitoba.ca/homepages/gratzer/&quot;&gt;George Gratzer&lt;/a&gt;’s comprehensive and recently updated &lt;u&gt;Lattice Theory : Foundation&lt;/u&gt;.  Lattice theory has been &lt;a href=&quot;http://www.ams.org/notices/199711/comm-rota.pdf&quot;&gt;described&lt;/a&gt; by &lt;a href=&quot;http://en.wikipedia.org/wiki/Gian-Carlo_Rota&quot;&gt;Gian-Carlo Rota&lt;/a&gt;, an accomplished twentieth century mathematician and lecturer, as having &quot;been the object of such vociferous vituperation&quot;.  The book &lt;u&gt;Combinitorics the Rota Way&lt;/u&gt;, which he coauthored, gives deep insights into this subject and its relationship to other areas of math including, of course, combinatorics, but also topology, set theory, Boolean algebras, probability theory, and more.  I think Rota will be vindicated with a vengeance as it seems to me that lattices show up almost everywhere in math.  Additionally I feel that lattice theory will be become quintessential in computer science and software engineering and should be a mandatory math for those curricula.  I will expand on these ideas in follow up posts.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;One anecdote tells of a senior mathematician who stopped Rota in the halls of MIT and stared at him demanding: &quot;Admit it! All lattice theory is trivial.&quot;  I confess I have some difficulty with lattice theory as it does seem to be both trivial and deep, at first the ideas don’t seem to really have that much substance, but deeper you dig the more things you find, and it seems that it is always showing up in other areas of math, and even if it is not obvious it often seems to be right under the surface.  I think that’s the duality here, the ideas, per se, are not that impressive, much of the importance comes from the application of the ideas and their relation to other areas of math.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In George Gratzer’s updated &lt;u&gt;Lattice Theory : Foundation&lt;/u&gt; he states that a difference between the new addition and the previous edition is the addition of more diagrams, and recommends the reader drawing their own as well, in my opinion he does not go far enough, one of the goals of this post to have some pictures for the basic ideas.  I admit I will do my best here to help the motivated learner, but this post should probably be viewed as supplemental to other resources.  Also you will need to have some knowledge of set theory and concepts like Cartesian products and some knowledge of &lt;a href=&quot;http://en.wikipedia.org/wiki/Abstract_algebra&quot;&gt;abstract algebra&lt;/a&gt; such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Group_theory&quot;&gt;group theory&lt;/a&gt; may also be helpful.  Also knowledge of basic &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_theory&quot;&gt;graph theory&lt;/a&gt; is needed.  You will also need some comfort level with basic mathematical notation.  If you don’t have this knowledge, hopefully you are willing to get up to speed on it, trust me, it’s worth it.  Another point to note is that everything covered here will be finite, all sets, orderings, and lattices are &lt;a href=&quot;http://en.wikipedia.org/wiki/Finite_set&quot;&gt;finite&lt;/a&gt;, I believe that much of this extends to the &lt;a href=&quot;http://en.wikipedia.org/wiki/Countable_set&quot;&gt;countable infinite&lt;/a&gt;, etc.  I leave that for you to pursue.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Lattices_Drawn_as_Graphs&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Lattices Drawn as Graphs&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Lattices have some connections to &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_theory&quot;&gt;graph theory&lt;/a&gt; and to really fully understand the nuances of these ideas you need to have an understanding of basic &lt;a href=&quot;http://www.elegantcoding.com/2011/08/object-graph.html&quot;&gt;graph theory&lt;/a&gt;, specifically the differences between &lt;a href=&quot;http://en.wikipedia.org/wiki/Directed_graph&quot;&gt;directed graphs&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Undirected_graph#Undirected_graph&quot;&gt;undirected graphs&lt;/a&gt; and an understanding of &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_cycle&quot;&gt;cycles&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Acyclic_graph&quot;&gt;acyclic graphs&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL9Pf-6Hg0odHy3hocf4CSFHvcZ00m6plx_0JjO6tLdoqfMjAfKX72Od8LKNYNFbBMO9RZdUAW_j6bjw2n6zOg4Em4GETdNGGmQdMreY0uXLYGJJ4LIXTVNMnhyBPj1ZZ5GGThVELgyG8E/s1600/UnitLattice.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL9Pf-6Hg0odHy3hocf4CSFHvcZ00m6plx_0JjO6tLdoqfMjAfKX72Od8LKNYNFbBMO9RZdUAW_j6bjw2n6zOg4Em4GETdNGGmQdMreY0uXLYGJJ4LIXTVNMnhyBPj1ZZ5GGThVELgyG8E/s400/UnitLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Lattices can be drawn as graphs the main diagram used to visually represent lattices is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Hasse_diagram&quot;&gt;Hasse diagram&lt;/a&gt; which depict lattices as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Undirected_graph#Undirected_graph&quot;&gt;undirected graph&lt;/a&gt;, more on this below.  Also it should be noted that issues of &lt;a href=&quot;http://en.wikipedia.org/wiki/Planar_graph&quot;&gt;graph planarity&lt;/a&gt; are ignored and two crossing edges, that is with no vertex, have no significance in terms of order, also sometimes for aesthetic reasons intersecting lines are shown as crossing behind other lines, again this has no impact on the order structure.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Binary_Relations&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Binary Relations&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Lattices are built on the concept of a &lt;a href=&quot;http://en.wikipedia.org/wiki/Binary_relation&quot;&gt;binary relation&lt;/a&gt; on a non empty &lt;a href=&quot;http://en.wikipedia.org/wiki/Set_%28mathematics%29&quot;&gt;set&lt;/a&gt;. This is usually expressed in terms of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cartesian_product&quot;&gt;Cartesian product&lt;/a&gt; of a set with itself, where R is the relation and S is the set:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;R : S x S &amp;rarr; S&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;In this case the binary relation emits a member of the same set, which means it is &lt;a href=&quot;http://en.wikipedia.org/wiki/Closure_%28mathematics%29&quot;&gt;closed&lt;/a&gt; on the set.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;For example for the set S = {a,b,c} a possible relation is the ordered pairs: R = {(a, c), (a, a), (b, c), (c, a)}.  In general a Binary Relation can be written as a set of ordered pairs.  When talking about orders there is a distinction as to whether the relationship between two elements in the set exists, meaning does the ordered pair (x,y) exist in R.  In the example above (b,c) exists, (b,c) &amp;isin; R. Also note that opposite relation of (b,c), (c,b) is not in R, (c,b) &amp;notin; R.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;This binary relation can be seen in the diagram below, each of the ordered pairs map to a directed edge:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRMlyUSJc6D26ronzfvYl9GCPpPnl3RnHswqL5rm-CV_dEhyphenhyphen_IRZ7XJ1xKBQxHevRRXVCk3pQKsbeKH7INWAaO78EDflTXzf6JCiWnFSBFUA597zyXYmi5zQAbT-FWMhRSCqvBny8grHBB/s1600/Binary+Relation.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;363&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRMlyUSJc6D26ronzfvYl9GCPpPnl3RnHswqL5rm-CV_dEhyphenhyphen_IRZ7XJ1xKBQxHevRRXVCk3pQKsbeKH7INWAaO78EDflTXzf6JCiWnFSBFUA597zyXYmi5zQAbT-FWMhRSCqvBny8grHBB/s400/Binary+Relation.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Properties_of_Binary_Relations&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Properties of Binary Relations&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Binary Relations can have certain properties.  I feel this is the crux of understanding ordering relationships.  The first two properties are:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Reflexive_relation&quot;&gt;Reflexive&lt;/a&gt; &amp;forall;x &amp;isin; S (x,x) &amp;isin; R&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Transitive_relation&quot;&gt;Transitive&lt;/a&gt;&amp;forall; x,y,z &amp;isin; S if (x,y) &amp;isin; R  and (y,z) &amp;isin; R then (x,z) &amp;isin; R&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;If a binary relation has these two properties, that is it is Reflexive and Transitive then it is known as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Preorder&quot;&gt;preorder&lt;/a&gt; or &lt;b&gt;quasi-order&lt;/b&gt;.  This is a more general type of binary relation which we are not really interested in initially except in how it relates to two more specific types of binary relations.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The &lt;b&gt;symmetric&lt;/b&gt; property is defined as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Symmetric_relation&quot;&gt;Symetric&lt;/a&gt; &amp;forall; x,y &amp;isin; S if (x,y) &amp;isin; R  then (y,x) &amp;isin; R&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;A &lt;b&gt;preorder&lt;/b&gt; with the symmetric property is known as an &lt;a href=&quot;http://en.wikipedia.org/wiki/Equivalence_relation&quot;&gt;equivalence relation&lt;/a&gt;.  In terms of Lattice Theory this is another binary relation that we are not immediately interested in.  &lt;b&gt;Equivalence relations&lt;/b&gt; are well worth learning more about in their own right, as they play an important role in partitioning &lt;a href=&quot;http://en.wikipedia.org/wiki/Partition_of_a_set&quot;&gt;sets&lt;/a&gt; which have interesting applications in &lt;a href=&quot;http://en.wikipedia.org/wiki/Abstract_algebra&quot;&gt;abstract algebra&lt;/a&gt; in relation to &lt;a href=&quot;http://en.wikipedia.org/wiki/Quotient_set&quot;&gt;quotients&lt;/a&gt; of &lt;a href=&quot;http://en.wikipedia.org/wiki/Quotient_group&quot;&gt;groups&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Quotient_ring&quot;&gt;rings&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Homomorphism&quot;&gt;homomorphisms&lt;/a&gt; of &lt;a href=&quot;http://en.wikipedia.org/wiki/Group_%28mathematics%29&quot;&gt;groups&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Ring_%28mathematics%29&quot;&gt;rings&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The next property, which we are very interested in, is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Antisymmetric_relation&quot;&gt;antisymmetric&lt;/a&gt; property which is defined as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Symmetric_relation&quot;&gt;Antisymmetric&lt;/a&gt; &amp;forall; x,y &amp;isin; S if (x,y) &amp;isin; R and (y,x) &amp;isin; R then x = y&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;A &lt;b&gt;preorder&lt;/b&gt; with the &lt;b&gt;antisymmetric&lt;/b&gt; property is known as an &lt;a href=&quot;http://en.wikipedia.org/wiki/Order_relation&quot;&gt;order relation&lt;/a&gt; sometimes referred to as a &lt;b&gt;partial order&lt;/b&gt;. A set with a &lt;a href=&quot;http://en.wikipedia.org/wiki/Partially_ordered_set&quot;&gt;partial order&lt;/a&gt; on it is called a &lt;a href=&quot;http://en.wikipedia.org/wiki/Partially_ordered_set&quot;&gt;partially ordered set&lt;/a&gt;, &lt;b&gt;poset&lt;/b&gt;, or just an &lt;b&gt;ordered set&lt;/b&gt;.  So now we have a definition of an order:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;If S is a non-empty set then by an order on S we mean a binary relation on S that is reflexive, anti-symmetric, and transitive.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;We will now use the less than equals symbol &amp;le; to denote our order relation which follows as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;table border=&quot;0&quot;&gt;&lt;tr&gt;&lt;td&gt;(&amp;forall;x&amp;isin; S) x &amp;le; x;                                     &lt;/td&gt;&lt;td&gt;(reflexive)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;(&amp;forall;x, y &amp;isin; S) if x &amp;le; y and y &amp;le; x then x = y;      &lt;/td&gt;&lt;td&gt;(antisymmetric)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;(&amp;forall;x, y, z &amp;isin; S) if x &amp;le; y and y &amp;le; z then x &amp;le; z.&lt;/td&gt;&lt;td&gt;(transitive)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;In general an order is defined using the notational convention: (S, &amp;le;) where S is the Set on which  the order is defined and &amp;le; denotes ordering relation.  &lt;b&gt;Note&lt;/b&gt;:  &amp;le; is not necessarily the same as less than or equals, it might be, but it could also be a number of other order relations.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Comparability_Partial_Orders_Total_Orders_Antichains&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Comparability: Partial Orders, Total Orders and Antichains&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;One thing that I found confusing when learning about &lt;b&gt;ordering relations&lt;/b&gt; is the difference between a &lt;b&gt;total order&lt;/b&gt; and a &lt;b&gt;partial order&lt;/b&gt;.  The idea of a &lt;b&gt;partial order&lt;/b&gt; is that not all elements in a set have a relation.  Some pairs of elements are incomparable, meaning no relation exists between them.  This is denoted using the parallel lines symbol: &amp;#x2225;, for example x &amp;#x2225; y means (x,y) &amp;notin; R and (y,x) &amp;notin; R. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;An example of a partial order is the set of partitions below:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy05XctErkqKY48s9lLS5Czg6oU4_1A2biFCcpaDQ3muxn2YBGHn3wyQZoR6hCxUgzcuHyGM24sRujOg6LEChBIH4zZJzyah5CmQH1JbabSgRvi6uVEsvU4s_wHG56aDIRPkdwC3QEdGOR/s1600/setPartitionLattice.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;260&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy05XctErkqKY48s9lLS5Czg6oU4_1A2biFCcpaDQ3muxn2YBGHn3wyQZoR6hCxUgzcuHyGM24sRujOg6LEChBIH4zZJzyah5CmQH1JbabSgRvi6uVEsvU4s_wHG56aDIRPkdwC3QEdGOR/s400/setPartitionLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This is a partial order of set partitions of a set of three items.  For example suppose that the set {a,b,c} is a plate containing an apple, a banana and a cherry.  As you move down the lattice you get more partitions, in the second row you can partition two pieces of fruit onto one plate and one on another, in three different ways {a}, {b,c}  or  {b}, {a,c}  or  {c}, {a,b} .  In the bottom row you can only partition three pieces of fruit one way on three different plates {a},{b},{c}.  If you move up the lattice you can reverse the operation and consolidate the set partitions (plates) in the same manner. &lt;/p&gt;&lt;br /&gt;
&lt;p&gt;You should note that above the elements:  a|bc,  b|a,c, and c|a,b have no ordering relation to each other, that is there is no way to further partition the current plates, rearranging them isn’t allowed. So these items are incomparable: a|bc  &amp;#x2225;  b|a,c,   b|a,c  &amp;#x2225;  c|a,b , ...&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A &lt;a href=&quot;http://en.wikipedia.org/wiki/Total_order&quot;&gt;total order&lt;/a&gt; is also known as a &lt;b&gt;linear order&lt;/b&gt; or a &lt;b&gt;chain&lt;/b&gt;. In a &lt;b&gt;total order&lt;/b&gt; all elements are comparable meaning that the relationship has the following total property:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Total_relation&quot;&gt;Total&lt;/a&gt; &amp;forall; x,y &amp;isin; S  (x,y) &amp;isin; R  or  (y,x) &amp;isin; R&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;A fairly simple example of a &lt;b&gt;chain&lt;/b&gt; is the integers 1-5 with the ordering relation less than or equals, which would be written as ({1,2,3,4,5}, &amp;le;) which would have the following diagram:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhqooj0Fa92h1Len0FyKzugBC26hry88DQma6Qs9jGFyhyphenhyphenxuCzvRFiBPTgna4MUJf31qsZRn4UTPrcju2CDWZf3ei-gzH4jTyPLHzNvwZeCc2_jAzpdvJFdPhwKFl9Crm9LaW4asoYNYIc/s1600/totalOrder.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; width=&quot;40&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhqooj0Fa92h1Len0FyKzugBC26hry88DQma6Qs9jGFyhyphenhyphenxuCzvRFiBPTgna4MUJf31qsZRn4UTPrcju2CDWZf3ei-gzH4jTyPLHzNvwZeCc2_jAzpdvJFdPhwKFl9Crm9LaW4asoYNYIc/s400/totalOrder.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;An &lt;a href=&quot;http://en.wikipedia.org/wiki/Antichain&quot;&gt;antichain&lt;/a&gt; is a set where no two elements are comparable:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Antichain&quot;&gt;Antichain&lt;/a&gt; &amp;forall; x,y &amp;isin; S  (x,y) &amp;notin; R  and (y,x) &amp;notin; R&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;An example is the suits of a card deck, there are probably some exceptions, but in general a spade, a heart, a club and a diamond have no order relation to each other, this antichain can be depicted as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfiEKOK9GznSspCcNNEQAn3Azcd4viaWdMJFXc1OnHxbamk9qunypFVcDVUKxvkcDycbNfZxFxLWfvvr8p60s5yIeqVXCZX2MoKOL979-BTUUEYwBLgDIhm8taoBkfHe6P-J59tjn22nb7/s1600/Antichain.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;198&quot; width=&quot;276&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfiEKOK9GznSspCcNNEQAn3Azcd4viaWdMJFXc1OnHxbamk9qunypFVcDVUKxvkcDycbNfZxFxLWfvvr8p60s5yIeqVXCZX2MoKOL979-BTUUEYwBLgDIhm8taoBkfHe6P-J59tjn22nb7/s400/Antichain.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Also you should note that above the elements:  a|bc,  b|a,c, and c|a,b in our set partition lattice above form an &lt;b&gt;antichain&lt;/b&gt; within that lattice.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Order_Duality&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Order Duality&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Order duality is actually a fairly intuitive idea, for example if you had a list of words in alphabetical order, you can reverse the order. This holds true for every ordering relation and is called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Duality_%28order_theory%29&quot;&gt;Duality principle&lt;/a&gt;.  More formally if you have an order P = (S, &amp;le;), its dual denoted P&lt;sup&gt;d&lt;/sup&gt; would be defined as P&lt;sup&gt;d&lt;/sup&gt; =(S, &amp;ge;).  If you take any of the lattice examples above or below and reverse them, flip them upside-down, you get the dual of the order relation.  This is one of the most seminal ideas in order theory. It also shows up in other parts of math.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Powerset_Lattice&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;The Powerset Lattice&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The &lt;a href=&quot;http://en.wikipedia.org/wiki/Powerset&quot;&gt;powerset&lt;/a&gt; of set is a set of all of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Subset&quot;&gt;subsets&lt;/a&gt; of the set.  For a set of three items, S = {a,b,c} The power set of S, which is a set of sets, is: { {a,b,c}, {a,b }, {a,c}, {b,c}, {a}, {b}, {c}, &amp;empty; }.  A common notation for denoting the powerset is 2&lt;sup&gt;S&lt;/sup&gt;.  This notation draws from the fact that the cardinality of the &lt;b&gt;powerset&lt;/b&gt; is the cardinality, the size of the set, of the set raised to the power of 2, this can be expressed more concisely using the notation |S| to describe cardinality, so the above set has the cardinality |S| = 3. The powerset of S 2&lt;sup&gt;S&lt;/sup&gt; has the cardinality |2&lt;sup&gt;S&lt;/sup&gt; | = 2&lt;sup&gt;3&lt;/sup&gt; = 8.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The &lt;b&gt;lattice&lt;/b&gt; below shows the &lt;b&gt;ordering relation&lt;/b&gt; &quot;is a subset of&quot;, this can be denoted by &amp;sube; and the order would be given in notational form as (2&lt;sup&gt;S&lt;/sup&gt;, &amp;sube;).&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDkVUJLVROxW1Jx8ZXo4YT6a28UsfxBCh8KQkWUCWX2zXk-VFzcij4gtLoDxWBllkeJQUd5RbdQsmieCfKpYuMYFll4XaVY4f0jhEO5ZTKDtYZHvO6mUeSEPY4VHp_H6CGqDZ8wyQ8FqQM/s1600/powerSetLatticeUp.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDkVUJLVROxW1Jx8ZXo4YT6a28UsfxBCh8KQkWUCWX2zXk-VFzcij4gtLoDxWBllkeJQUd5RbdQsmieCfKpYuMYFll4XaVY4f0jhEO5ZTKDtYZHvO6mUeSEPY4VHp_H6CGqDZ8wyQ8FqQM/s400/powerSetLatticeUp.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Its &lt;b&gt;order dual&lt;/b&gt; which is &quot;is a superset of&quot; given by (2&lt;sup&gt;S&lt;/sup&gt;, &amp;supe;):&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyZ2qoZaBLZ3g2fUo3XsUqvwbhCLqdNt8lVYwRK9MSZxJFZugCITwYZuKJAz0J2Rcynyu11TaiusRnWO7W3IV35nL7B298BQbQt2i7baPxbYtgdZjEE0NE5Dgrv4qLleHExV9zD9l1Aj-1/s1600/powerSetLatticeDown.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyZ2qoZaBLZ3g2fUo3XsUqvwbhCLqdNt8lVYwRK9MSZxJFZugCITwYZuKJAz0J2Rcynyu11TaiusRnWO7W3IV35nL7B298BQbQt2i7baPxbYtgdZjEE0NE5Dgrv4qLleHExV9zD9l1Aj-1/s400/powerSetLatticeDown.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Binary_Relations_Drawn_as_Graphs&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Binary Relations Drawn as Graphs&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Now that we have some definitions and diagrams in place I wanted to revisit the drawing of lattice diagrams.  Our first relation diagram above has a loop for (a,a) and (b,c) (c,a) makes it &lt;b&gt;transitive&lt;/b&gt;, but it is not &lt;b&gt;reflexive&lt;/b&gt; because it is missing loops for b and c.  So that relation is not a &lt;b&gt;preorder&lt;/b&gt; which means it is also neither an &lt;b&gt;equivalence relation&lt;/b&gt; nor an &lt;b&gt;ordering relation&lt;/b&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;For every preorder, there corresponds a &lt;a href=&quot;http://en.wikipedia.org/wiki/Directed_graph&quot;&gt;directed graph&lt;/a&gt;, with elements of the set corresponding to vertices, and the order relation between pairs of elements corresponding to the directed edges between vertices.  Graphs of preorders can contain cycles.  Also all nodes in a preorder group will have a &lt;a href=&quot;http://en.wikipedia.org/wiki/Loop_%28graph_theory%29&quot;&gt;loop&lt;/a&gt; for the reflexive relation that must exists on each node.  Graphs representing equivalence relations will be &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_%28mathematics%29#Undirected_graph&quot;&gt;undirected graphs&lt;/a&gt; since these &lt;b&gt;relations&lt;/b&gt; are &lt;b&gt;symmetric&lt;/b&gt; and will of course have loops on each vertex for reflexivity.   As mentioned above graphs for partial orders will be a &lt;a href=&quot;http://en.wikipedia.org/wiki/Directed_acyclic_graph&quot;&gt;directed acyclic graph&lt;/a&gt; graph due to antisymmetry also they should have reflexivity loops.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The total order for 1-6 mentioned above would look as follows for the relation &amp;le; it is a simple directed graph:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9pTHtHrEafWklnL8-eS9rFN7lI9YZ-4B9hfMKoU6uiv3p0UUh2lbL3buh3jIniHWZdwUGy8oH5TZpfU7CZKXMVPKTKXjGWGA0TsSDPdG4ZlS0CsXOGATExlg35FEL4sL8dfUUSW2J8id/s1600/total2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;62&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh9pTHtHrEafWklnL8-eS9rFN7lI9YZ-4B9hfMKoU6uiv3p0UUh2lbL3buh3jIniHWZdwUGy8oH5TZpfU7CZKXMVPKTKXjGWGA0TsSDPdG4ZlS0CsXOGATExlg35FEL4sL8dfUUSW2J8id/s400/total2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;If we were to add all of the transitive and reflexive relations it would look like this:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjowQKnurwcWHgsQgIwTv9goMVWWE_lwweEv1KuGPFMgz8rTA2O7lmqBqAcBqG7MNYZdOK-U_Ul4MA0nuVOba9K2iuuOKQey5wGw8znnO3hMVUeiq9eK96PvbbYc9Vh7TyKpAZ_9NhBDGPW/s1600/total.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjowQKnurwcWHgsQgIwTv9goMVWWE_lwweEv1KuGPFMgz8rTA2O7lmqBqAcBqG7MNYZdOK-U_Ul4MA0nuVOba9K2iuuOKQey5wGw8znnO3hMVUeiq9eK96PvbbYc9Vh7TyKpAZ_9NhBDGPW/s400/total.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;As we have seen in our diagrams the reflexivity loops are omitted as they are not needed and would be increase the complexity of the diagrams.  Also in the diagrams the transitivity can be inferred by following the two paths connecting three nodes.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Hasse diagrams are drawn as undirected graphs which implies the order duality, we can decompose that graph into two directed graphs as in our example above for the two dual realtions (subset &amp;sube; and superset &amp;supe;) on the powerset lattice, the lattice is conventionally drawn as the following Hasse diagram: &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNpt6QJm7eRqW9dGTFYt_bvqG6jYL7W7pTxA9_HsJG4ASnSKE1LwhdGG1ubw1EVCiaGKO0pfddFckWxn05F0PNwvAQPEErPn6813qW4rD-1evXkntZKp5isiKw7s2W99dRDrgqPRc1ZC2K/s1600/PowerSetLattice.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNpt6QJm7eRqW9dGTFYt_bvqG6jYL7W7pTxA9_HsJG4ASnSKE1LwhdGG1ubw1EVCiaGKO0pfddFckWxn05F0PNwvAQPEErPn6813qW4rD-1evXkntZKp5isiKw7s2W99dRDrgqPRc1ZC2K/s400/PowerSetLattice.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Another interesting point here is the difference between equivalence relations and order relations is that no cycles will occur in an ordering relation.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Subsets_of_Posets&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Subsets of Posets&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Since we are dealing with sets, a set with an order relation, a poset (short for partially ordered set), can have subsets.  The interesting thing is that the subsets as a whole can be different types of orders than the original poset.  For example the power set above has as a sub-poset, {a,b,c}-{a,b}-{a}-&amp;empty;, which is a total order.  Additionally the antichain {{a,b}  {a,c}  {b,c}} is also a subset of the powerset poset.  These elements still have the same relations as they did in the original set, but the subsets themselves are different structures.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Upper_and_Lower_Bounds&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Upper and Lower Bounds&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;A finite set, remember we are only considering finite sets, with an order relation implies that if you move up and down the ordering relation eventually you will hit a maximum or minimum element.  The above examples, the total order has an upper bound of 5 and lower bound of 1, the powerset lattice has an upper bound of the set itself and the empty set as a lower bound.  The antichain does not have a single upper or lower bound the four elements are each both their upper and their lower bounds.  The idea of &lt;a href=&quot;http://en.wikipedia.org/wiki/Upper_and_lower_bounds&quot;&gt;bounds&lt;/a&gt;, specifically the idea of &lt;b&gt;greatest lower bound&lt;/b&gt; (&lt;b&gt;GLB&lt;/b&gt;)  which is also known as an &lt;a href=&quot;http://en.wikipedia.org/wiki/Infimum&quot;&gt;infimum&lt;/a&gt; and the dual the &lt;b&gt;least upper bound&lt;/b&gt; (&lt;b&gt;LUB&lt;/b&gt;) which also known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Supremum&quot;&gt;supremum&lt;/a&gt; are important in order theory but show up in other areas of math such as topology.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A poset may not have one upper or lower bound, this is a distinction from a lattice which is still a poset but it has a single upper and lower bound.   A lattice will have both a distinct upper and distinct lower bound, that is one element that is the upper bound and one element that is the lower bound. These are sometimes denoted as &amp;#x22A4; for upper bound and &amp;perp; for lower bound.  This bounding feature of lattices is very important as we will see.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;The_Samuel_L_Jackson_Lattice&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;The Samuel L Jackson Lattice (Total Order)&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Since Samuel L. Jackson has a habit of showing up everywhere, he is the new Kevin Bacon, and it is only fitting that he would show up in Lattice Theory.  Another example of a &lt;b&gt;total order&lt;/b&gt; or &lt;b&gt;chain&lt;/b&gt; is what is known as the &quot;&lt;a href=&quot;http://www.thedailyshow.com/watch/wed-june-23-2010/samuel-l--jackson-scale-of-black-emotion&quot;&gt;Samuel L. Jackson Scale of Black Emotion&lt;/a&gt;&quot; which was developed by Larry Willmore of the Daily Show.  It forms a &lt;b&gt;Total Order&lt;/b&gt; also known as the &lt;b&gt;Samuel L Jackson Lattice&lt;/b&gt;, which includes the following elements:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Furious Anger Guy&lt;/li&gt;
&lt;li&gt;Shaft&lt;/li&gt;
&lt;li&gt;Changing Lanes Guy&lt;/li&gt;
&lt;li&gt;Snakes on a Plane Guy&lt;/li&gt;
&lt;li&gt;Jurrasic Park Jackson &lt;/li&gt;
&lt;li&gt;Frozone&lt;/li&gt;
&lt;li&gt;Mace Windu&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;As you can see the sup(&lt;b&gt;Samuel L. Jackson Lattice&lt;/b&gt;) = &amp;#x22A4; = &quot;Furious Anger Guy&quot; and the inf(&lt;b&gt;Samuel L. Jackson Lattice&lt;/b&gt;) = &amp;perp; = &quot;Mace Windu&quot;. Now it’s pretty obvious in an intuitive human sense that the Master of the Order and Jedi &lt;a href=&quot;http://starwars.wikia.com/wiki/Mace_Windu&quot;&gt;Master Mace Windu&lt;/a&gt; is the &lt;b&gt;lattice&lt;/b&gt; &lt;b&gt;dual&lt;/b&gt; of Furious Anger Guy of Pulp Fiction, well up to his epiphany in the diner robbery scene anyway.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As with all lattices, this lattice has an &lt;b&gt;order dual&lt;/b&gt; denoted (&lt;b&gt;Samuel L Jackson Lattice&lt;/b&gt;)&lt;sup&gt;d&lt;/sup&gt; known as the &lt;b&gt;Inverse Samuel L Jackson Lattice&lt;/b&gt;, which just a reverse of the above list.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ok, I’m having a little fun here, trying to lighten the mood a little.  However, this is a legitimate example of a lattice.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Lattices_vs_Posets&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Lattices vs Posets&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;By definition a lattice is a poset, however, a poset is not necessarily a lattice.  A lattice is defined as, with sup being supremum and inf being infimum:&lt;/p&gt;&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;An order (S,&amp;le;) is a lattice if sup{a,b} and inf{a,b} exist &amp;forall; a, b &amp;isin; S.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Actually there are some distinctions between different classes of lattices:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A &lt;b&gt;lattice&lt;/b&gt; is a poset in which all &lt;b&gt;nonempty finite subsets&lt;/b&gt; have both a least upper bound and a greatest lower bound.&lt;/p&gt;&lt;p&gt;A &lt;b&gt;complete lattice&lt;/b&gt; is a poset in which &lt;b&gt;&lt;i&gt;all &lt;/i&gt;&lt;/b&gt;&lt;b&gt;subsets&lt;/b&gt; have both a least upper bound and a greatest lower bound.&lt;/p&gt;&lt;p&gt;A &lt;b&gt;bounded lattice&lt;/b&gt; has a unique top element and a unique bottom element, actually there are algebraic implications that we will discuss below.&lt;/p&gt;&lt;p&gt;Finite sets form complete lattices and since we are limiting ourselves to finite sets we will only be dealing with complete lattices. Also every complete lattice is a bounded lattice so when we talk about lattices here we will mean complete lattices aka bounded lattices.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Up_and_Down_Sets&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Up and Down Sets&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;If you take an element of a poset or a Lattice and take the subset of all elements that are greater than the element you get a new poset or lattice that is a subset, these types of subsets are referred to as &lt;a href=&quot;http://en.wikipedia.org/wiki/Upper_set&quot;&gt;up-sets&lt;/a&gt; or down-sets. An up-set of an element x denoted as &amp;uarr; x includes the element and everything above it is defined as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&amp;uarr; x = {y&amp;isin; P : y &amp;ge; x}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The up-set of the element {a} in the powerset lattice above would look like (shown in blue):&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdcIP-XI_mXsMGB87rFp6hODbNTyqCFhe5ptfvRJXlM6y1DmcFgzXununC7Cd32nMHPk6DYaJOztf8sqygMN5LKdVtXTyU9btxjFrFkY1PSSMtdJF4e58bGGYHc7Ic9WryzhkcyS5_9fwZ/s1600/PowerSetLatticeUpperSet1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdcIP-XI_mXsMGB87rFp6hODbNTyqCFhe5ptfvRJXlM6y1DmcFgzXununC7Cd32nMHPk6DYaJOztf8sqygMN5LKdVtXTyU9btxjFrFkY1PSSMtdJF4e58bGGYHc7Ic9WryzhkcyS5_9fwZ/s400/PowerSetLatticeUpperSet1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Similarly, or perhaps &quot;dually&quot; the down set, denoted as &amp;darr; x, is defined as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&amp;darr; x = {y&amp;isin; P : y &amp;le; x}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;With the down-set of the element {a,b} in the powerset lattice (in red):&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6eK6aK7XFXsmXuYaiWEQbM8lsKF3qP49GdwZE08MHhW-X6ezNgugNQUD-zUasxW1D2L9TA8DvytfBMhKD68HPvSZCjnnhCzq7YrdWAc3oy3wcKxLC5IBvKwGRNd0CQss8w632FIS6AZ8m/s1600/PowerSetLatticeDownSet.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6eK6aK7XFXsmXuYaiWEQbM8lsKF3qP49GdwZE08MHhW-X6ezNgugNQUD-zUasxW1D2L9TA8DvytfBMhKD68HPvSZCjnnhCzq7YrdWAc3oy3wcKxLC5IBvKwGRNd0CQss8w632FIS6AZ8m/s400/PowerSetLatticeDownSet.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;&gt;Meet_and_Join&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Meet and Join&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Join_and_meet&quot;&gt;Meet and Join&lt;/a&gt; are two binary operators defined on elements of posets and and lattices which yield a unique value and they are dual operations of each other.  In the case of a poset meet and join may or may not exist on any two elements, in the case of a bounded lattice they will exist.  Join is usually denoted with the or symbol: &amp;or; and meet is denoted with the and symbol: &amp;and;.  Join is equivalent to supremum and meet is equivalent to infumum. They are defined as: &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;x &amp;or; y = sup{x,y}&lt;/p&gt;&lt;p&gt;x &amp;and; y = inf{x, y}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The following describes their relation with ordering:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;x &amp;le; y  &amp;hArr; x &amp;or;  y = y&lt;/p&gt;&lt;p&gt;x &amp;le; y  &amp;hArr; x &amp;and;  y = x&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;As you can see above when two elements are comparable meet and join will reduce to the appropriate minimum or maximum element, when two elements are incomparable as in the picture of the join below between {a} &amp;or; {c} the lattice lines show how the join moves up to the element {a,c} that is above each element, not coincidently the join on this lattice is the set union operation &amp;cup; actually this join can be expressed as {a,c} = {a} &amp;cup; {c} which is right out of set theory.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQamNiGq0ProD554k3LXdMG8qO0s0nML3fWdkfGRCaRdS0f9SSh0Zv62BgWDySuLiNgfyW8Q1u-XfhxLWkw49M9yvSbuxOR242mDOPDHW9p76rMIgk2XPeS9h9AwYaU7btdF1ydpte7yzU/s1600/PowerSetLatticeAjoinC.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQamNiGq0ProD554k3LXdMG8qO0s0nML3fWdkfGRCaRdS0f9SSh0Zv62BgWDySuLiNgfyW8Q1u-XfhxLWkw49M9yvSbuxOR242mDOPDHW9p76rMIgk2XPeS9h9AwYaU7btdF1ydpte7yzU/s400/PowerSetLatticeAjoinC.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;And the dual relation is {a} &amp;cap; {c} = &amp;empty;:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwkwEJ-Thjt7bAue-ctp_JXcqrEPIfPSXSmkWmk98lo1B-j559L9oLm7-QlTXPNXeELSCPheg_aeOgItZ4H7xsF9amEfDABlvhCcTROZOpytKHDmZn5TlSPHpZ2H_G7SthjNc6Q37FrDLH/s1600/powerSetLatticeAMeetC.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwkwEJ-Thjt7bAue-ctp_JXcqrEPIfPSXSmkWmk98lo1B-j559L9oLm7-QlTXPNXeELSCPheg_aeOgItZ4H7xsF9amEfDABlvhCcTROZOpytKHDmZn5TlSPHpZ2H_G7SthjNc6Q37FrDLH/s400/powerSetLatticeAMeetC.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Semilattices&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Semilattices&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;A semilattice will define either a meet or a join operation over an order resulting in either a meet  semilattice or join semilattice, technically a lattice is both of these combined. A good example is a tree which as a single root node, let’s call it a lower bound aka an infimum, a common example is the prefix tree for strings, in this case we are using binary strings 0 or 1 up to length three:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJLIFGHKH7f7gCNg6x55R43-EZQv2eTibE_bPnSEQ2V4bGiMSIp5J0gtmaf2DrbX0AoX5C2vh81I3xk_p203hT2hPrWIaOZy3vC2vNDRXy6Man_DcKcLsV_ON5P1v1-rW-sjWYyGuS2umH/s1600/PrefixTree.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;280&quot; width=&quot;380&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJLIFGHKH7f7gCNg6x55R43-EZQv2eTibE_bPnSEQ2V4bGiMSIp5J0gtmaf2DrbX0AoX5C2vh81I3xk_p203hT2hPrWIaOZy3vC2vNDRXy6Man_DcKcLsV_ON5P1v1-rW-sjWYyGuS2umH/s400/PrefixTree.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;In this example the order relation is: &quot;Is a prefix of&quot;.  As you can see you can define a meet on any two elements with the empty string &amp;lambda; serving as the semi-lattice bottom &amp;perp;. Also as you can see there are no joins on this order.  Pretty much any tree can be viewed as semi lattice with descendency from the root node through all of the other nodes serving as the ordering relation.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Lattices_are_Algebraic&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Lattices are Algebraic&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;One of the interesting and sometimes confusing things about lattices is that, while they are structural they are also algebraic.  Meet and join follow a number of algebraic rules.  In general lattices can be defined as an algebra L=(S, &amp;and;, &amp;or;) which satisfy the following algebraic rules for all x, y, z &amp;isin; S:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Idempotent&quot;&gt;Idempotent &lt;/a&gt;&lt;/p&gt;&lt;p&gt;x &amp;and; x = x&lt;/p&gt;&lt;p&gt;x &amp;or; x = x,&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Commutative_property&quot;&gt;Commutative&lt;/a&gt;&lt;/p&gt;&lt;p&gt;x &amp;and; y = y &amp;and; x&lt;/p&gt;&lt;p&gt;x &amp;or; y = y &amp;or; x,&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Associative_property&quot;&gt;Associative&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;x &amp;and; (y &amp;and; z) = (x &amp;and; y) &amp;and; z&lt;/p&gt;&lt;p&gt;x &amp;or; (y &amp;or; z) = (x &amp;or; y) &amp;or; z,&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Absorption_law&quot;&gt;Absorption&lt;/a&gt;&lt;/p&gt;&lt;p&gt;x &amp;and; (x &amp;or; y) = x&lt;/p&gt;&lt;p&gt;x &amp;or; (x &amp;and; y) = x.&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The first three pairs of axioms say that L is both a meet and join semilattice. The fourth pair (the absorption laws) say that both operations induce the same order on L.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Since we are dealing with bounded lattices we extend the above laws to include the following for the top and bottom elements, here we will represent the bottom element &amp;perp; as 0 and the top element &amp;top; as 1.  For a bounded lattice the algebra is defined as L=(S, &amp;and;, &amp;or;, 0, 1) with the following identity laws:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;x &amp;or; 0 = x&lt;/p&gt;&lt;p&gt;x &amp;and; 1 = x&lt;/p&gt;&lt;p&gt;x &amp;and; 0 = 0&lt;/p&gt;&lt;p&gt;x &amp;or; 1 = 1&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;For our powerset lattice above the algebra is (S, &amp;cap;, &amp;cup;, &amp;empty;, S) with the empty set as the identity for the union operation and the set itself as the identity for the intersection.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;Distributive&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Other Lattice Properties and Operations&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;If you take our powerset example above, you might have noticed that there are some more algebraic properties of this lattice that are not listed above.  The first is the distributive property.  While the powerset lattice does have the distributive property you should note that not all lattices do.  The &lt;a href=&quot;http://en.wikipedia.org/wiki/Distributivity_%28order_theory%29&quot;&gt;distributive property&lt;/a&gt; is defined as:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;b&gt;Distributive&lt;/b&gt; &lt;b&gt;Law&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;or; (y &amp;and; z) = (x &amp;or; y) &amp;and; (x &amp;or; z)&lt;/p&gt;&lt;p&gt;x &amp;and; (y &amp;or; z) = (x &amp;and; y) &amp;or; (x &amp;and; z)&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Another property which can be found in certain lattices and also applies to our powerset lattice is the property of &lt;a href=&quot;http://en.wikipedia.org/wiki/Complemented_lattice&quot;&gt;complementation&lt;/a&gt; which means that for every element x the lattice has a complement y under both the meet and join operations:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;x &amp;and; y = 0&lt;/p&gt;&lt;p&gt;x &amp;or; y = 1&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Some Lattice which are Complemented can have additional properties which is known as orthocomplementation and has the following laws:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;b&gt;Complement Law&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;and; x&lt;sup&gt;c&lt;/sup&gt; = 0&lt;/p&gt;&lt;p&gt;x &amp;or; x&lt;sup&gt;c&lt;/sup&gt; = 1&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Involution Law&lt;/b&gt;&lt;/p&gt;&lt;p&gt;(x&lt;sup&gt;c&lt;/sup&gt;)&lt;sup&gt;c&lt;/sup&gt; = x&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Order Reversing&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;le; y then y&lt;sup&gt;c&lt;/sup&gt; &amp;le; x&lt;sup&gt;c&lt;/sup&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Our power set lattice which is also a &lt;a href=&quot;http://en.wikipedia.org/wiki/Boolean_algebra_%28structure%29&quot;&gt;Boolean Algrebra&lt;/a&gt; also follows &lt;a href=&quot;http://en.wikipedia.org/wiki/De_Morgan%27s_laws&quot;&gt;Demorgans laws&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;b&gt;Demorgans laws&lt;/b&gt;&lt;/p&gt;&lt;p&gt;(x &amp;or; y)&lt;sup&gt;c&lt;/sup&gt; = x&lt;sup&gt;c&lt;/sup&gt; &amp;and; y&lt;sup&gt;c&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;(x &amp;and; y)&lt;sup&gt;c&lt;/sup&gt; = x&lt;sup&gt;c&lt;/sup&gt; &amp;or; y&lt;sup&gt;c&lt;/sup&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Some lattices can have a property known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Modular_lattice&quot;&gt;Modularity&lt;/a&gt; which follows the following law, which is similar to the distributive law:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;b&gt;Modular law&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;le; z implies x &amp;or; (y &amp;and; z) = (x &amp;or; y) &amp;and; z&lt;/p&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;I am including Modularity for completeness as I am not discussing it or including examples.  Distributivity, Modularity and Complementation have many intricacies and there is much theory and complexity surrounding how these work and where they show up, this becomes quickly obvious if you dig into more resources on lattices.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;The_Algebraic_Structure_of_the_Powerset_Lattice&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;The Algebraic Structure of the Powerset Lattice&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;With the above algebraic laws of complemented (orthocomplemented) bounded lattices defined, I figured it might be nice to list out these laws as they apply to our powerset lattice, if we take the powerset 2&lt;sup&gt;S&lt;/sup&gt; of any set S, the empty set &amp;empty; is the lower bound and the set S is the upper bound. The powerset lattice has the following laws:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;&lt;b&gt;Idempotent&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cap; x = x&lt;/p&gt;&lt;p&gt;x &amp;cup; x = x&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Commutative&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cap; y = y &amp;cap; x&lt;/p&gt;&lt;p&gt;x &amp;cup; y = y &amp;cup; x&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Associative&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cap; (y &amp;cap; z) = (x &amp;cap; y) &amp;cap; z&lt;/p&gt;&lt;p&gt;x &amp;cup; (y &amp;cup; z) = (x &amp;cup; y) &amp;cup; z&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Absorption&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cap; (x &amp;cup; y) = x&lt;/p&gt;&lt;p&gt;x &amp;cup; (x &amp;cap; y) = x&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Distributive&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cup; (y &amp;cap; z) = (x &amp;cup; y) &amp;cap; (x &amp;cup; z)&lt;/p&gt;&lt;p&gt;x &amp;cap; (y &amp;cup; z) = (x &amp;cap; y) &amp;cup; (x &amp;cap; z)&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Identity&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cup; &amp;empty; = x&lt;/p&gt;&lt;p&gt;x &amp;cap; S = x&lt;/p&gt;&lt;p&gt;x &amp;cap; &amp;empty; = &amp;empty;&lt;/p&gt;&lt;p&gt;x &amp;cup; S = S&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Complement Law&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;cap; x&lt;sup&gt;c&lt;/sup&gt; = &amp;empty;&lt;/p&gt;&lt;p&gt;x &amp;cup; x&lt;sup&gt;c&lt;/sup&gt; = S&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Involution Law&lt;/b&gt;&lt;/p&gt;&lt;p&gt;(x&lt;sup&gt;c&lt;/sup&gt;)&lt;sup&gt;c&lt;/sup&gt; = x&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Order Reversing&lt;/b&gt;&lt;/p&gt;&lt;p&gt;x &amp;sube; y  then  y&lt;sup&gt;c&lt;/sup&gt; &amp;sube; x&lt;sup&gt;c&lt;/sup&gt;&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;b&gt;Demorgans laws&lt;/b&gt;&lt;/p&gt;&lt;p&gt;(x &amp;cup; y)&lt;sup&gt;c&lt;/sup&gt; = x&lt;sup&gt;c&lt;/sup&gt; &amp;cap; y&lt;sup&gt;c&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;(x &amp;cap; y)&lt;sup&gt;c&lt;/sup&gt; = x&lt;sup&gt;c&lt;/sup&gt; &amp;cup; y&lt;sup&gt;c&lt;/sup&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;The_D4_Dihedral_Subgroup_Lattice&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;The D4 Dihedral Subgroup Lattice&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;This topic might be filed under an advanced example, so feel free to skip if you’ve had enough for the moment.  In doing my research I came across the following lattice diagram, it is the lattice of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Lattice_of_subgroups&quot;&gt;subgroups&lt;/a&gt; of the D&lt;sub&gt;4&lt;/sub&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Dihedral_group&quot;&gt;Dihedral Group&lt;/a&gt;, I looked at cyclic groups and subgroups including the cyclic subgroups of D&lt;sub&gt;4&lt;/sub&gt; in a &lt;a href=&quot;http://www.elegantcoding.com/2012/03/interesting-group.html&quot;&gt;previous post&lt;/a&gt; on abstract algebra.  I have modified it to better show the identity element marked in blue. It also includes the names of well known isomorphic groups that correspond to each subgroup.&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_OnsWo3eePkTnSgOwwtsknBxJXLR9NjBotO5NzWM8wO-R1MjOOfap98qERmzF1spAhoDFZi1-u6JM6fPu-HQ0pxOeLreIGRYXzkhngyptdk1MgOtNvM68z6TFSn84NfRhe_pq4HwXwkav/s1600/500px-Dih4_subgroups_svg+-+Modified.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;370&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_OnsWo3eePkTnSgOwwtsknBxJXLR9NjBotO5NzWM8wO-R1MjOOfap98qERmzF1spAhoDFZi1-u6JM6fPu-HQ0pxOeLreIGRYXzkhngyptdk1MgOtNvM68z6TFSn84NfRhe_pq4HwXwkav/s400/500px-Dih4_subgroups_svg+-+Modified.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;This lattice shows some really interesting things about the dihedral group.  The top element is the D&lt;sub&gt;4&lt;/sub&gt; group itself and the bottom element is the trivial Z&lt;sub&gt;1&lt;/sub&gt; group consisting of only the identity.  As you can see the center forms a chain consisting of three cyclic groups, Z&lt;sub&gt;1&lt;/sub&gt;, Z&lt;sub&gt;2&lt;/sub&gt;, Z&lt;sub&gt;4&lt;/sub&gt;, and D&lt;sub&gt;4&lt;/sub&gt; (not cyclical).  The anti-chain of five Z&lt;sub&gt;2&lt;/sub&gt; isomorphic groups, all of which are &lt;a href=&quot;http://en.wikipedia.org/wiki/Involution_%28mathematics%29&quot;&gt;involutions&lt;/a&gt;, like negation it is an operation which if applied twice results in the original value, on the left are the horizontal (H) and vertical (V) reflection involutions, the middle one is a 180 degree rotation (R&lt;sub&gt;2&lt;/sub&gt;) involution and on the right are two diagonal (D&lt;sub&gt;1&lt;/sub&gt;, D&lt;sub&gt;2&lt;/sub&gt;) reflection involutions. As you can see on the vertical and horizontal involutions on the left along with the rotation involution form the group (R&lt;sub&gt;0&lt;/sub&gt;, V, H, R&lt;sub&gt;2&lt;/sub&gt;) and on similarly on the right the subgroup (R&lt;sub&gt;0&lt;/sub&gt;, D&lt;sub&gt;1&lt;/sub&gt;, D&lt;sub&gt;2&lt;/sub&gt;, R&lt;sub&gt;2&lt;/sub&gt;) is formed.  Also both of these groups are isomorphic to what is known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Klein_four-group&quot;&gt;V group&lt;/a&gt;, aka the four group, aka Klein group, aka the Vierergruppe.  I am not sure what all of this means but I find it fascinating.  Also please note that there is a minor nomenclature conflict as V refers to both the Klein group and the vertical reflection D&lt;sub&gt;4&lt;/sub&gt; group element, but the context of each is mutually exclusive. The same goes for D&lt;sub&gt;n&lt;/sub&gt; where D&lt;sub&gt;1&lt;/sub&gt; and D&lt;sub&gt;2&lt;/sub&gt; are elements and D&lt;sub&gt;4&lt;/sub&gt; is a group.  Additionally this lattice give a nice visual depiction of &lt;a href=&quot;http://en.wikipedia.org/wiki/Lagrange%27s_theorem_%28group_theory%29&quot;&gt;Lagrange&#39;s Theorem&lt;/a&gt; which states that the order of each subgroup will evenly divide the order of the group.  Therefore, as in the lattice, a group of order 8 only has subgroups of orders 4,2,1.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&quot;Notation&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Some Notes on Notation&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;In math notation can vary and order theory has several variants on notation that it helps to be aware of.  Firstly the following sets of symbols can often be used in relations to orders:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX8ZsvsZd6U24Bs1-7hYpvpPjXC-08xR8Lx_zCNh4YgdmSx3fTWkZ-DJ6cAKG0AmQbQPUMp-KOo_lY5_LqihewBwflcH_5v0_myZdjBXzYp8o-SxHyk32W6ZbOUHoNmmPsByNO8y4WHKxt/s1600/wedge.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;65&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiX8ZsvsZd6U24Bs1-7hYpvpPjXC-08xR8Lx_zCNh4YgdmSx3fTWkZ-DJ6cAKG0AmQbQPUMp-KOo_lY5_LqihewBwflcH_5v0_myZdjBXzYp8o-SxHyk32W6ZbOUHoNmmPsByNO8y4WHKxt/s400/wedge.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioW0iSUv25HruW1Zb1p7A_3DFWqSemDt0C8flf3IBDCSyCRnFwa4lZIqcIfoDCG6Oj_Ropk-upYV1uW_CBEuOBPE5Et0-bcNa-Me_r7kuFi1shc8iRCrI5q9m59O5J3ZVFYXI9EbuFxFwB/s1600/sqcap.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;66&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioW0iSUv25HruW1Zb1p7A_3DFWqSemDt0C8flf3IBDCSyCRnFwa4lZIqcIfoDCG6Oj_Ropk-upYV1uW_CBEuOBPE5Et0-bcNa-Me_r7kuFi1shc8iRCrI5q9m59O5J3ZVFYXI9EbuFxFwB/s400/sqcap.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnU5Gtd3Im3uOtM12oTGIpEGQCkGDBxSt0qCT73QZufQ6t64DSsQ-1VhluVWpoN6xMbcYz1fYK7n9Ql13F0LGXpBBF7cw2onRQqFU2fvTcIgJl2rjHyy4ioCCkxNJyascrFGsIYLnGH17I/s1600/cap.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;65&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnU5Gtd3Im3uOtM12oTGIpEGQCkGDBxSt0qCT73QZufQ6t64DSsQ-1VhluVWpoN6xMbcYz1fYK7n9Ql13F0LGXpBBF7cw2onRQqFU2fvTcIgJl2rjHyy4ioCCkxNJyascrFGsIYLnGH17I/s400/cap.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Sometimes these choices are made at a particular authors preference other times combinations of these are used, such as in discussing things like &lt;a href=&quot;http://en.wikipedia.org/wiki/Galois_connection&quot;&gt;Galois Connections&lt;/a&gt; which are mappings between two different orders, in such a case multiple sets of the above symbols might be needed to differentiate between specific instances of different orders.  Usually the set notation symbols are not used for lattices but they sometimes are, and in our examples above both meanings apply.  Also the following symbols get used to describe comparison as well:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0cwZyFHZfNUwTwCw39HSFRpwzgXwXgUx8kayqsRgjw65Z7HKn37VZR-7ivAUmqCbkpEJvKsf0TZruD93WRU1q9RlhP5BmM6TL1rtXQeu7xrGFzuZSRogO46FrRLNlhaJKr3CJGZOSPnEd/s1600/succ.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0cwZyFHZfNUwTwCw39HSFRpwzgXwXgUx8kayqsRgjw65Z7HKn37VZR-7ivAUmqCbkpEJvKsf0TZruD93WRU1q9RlhP5BmM6TL1rtXQeu7xrGFzuZSRogO46FrRLNlhaJKr3CJGZOSPnEd/s400/succ.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Another set of symbols that show up, which are often used to describe covers, or immediately precedes or immediately succeeds, in that there are no elements between the two items compared are:  &lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeaurgK1L2OqscbdftKaU036eHJNXsBw5AV5mViroR4TXwJHuaaK60BWzIcDpEriKnJJ0NTDjJ3Gnmbloe4-VAZMas9ITVnE-NTFv4_SxgJZPUrWyYkt22zY6teZ-TGgV_ZN7nulXYbEXw/s1600/cover.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;10&quot; width=&quot;29&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeaurgK1L2OqscbdftKaU036eHJNXsBw5AV5mViroR4TXwJHuaaK60BWzIcDpEriKnJJ0NTDjJ3Gnmbloe4-VAZMas9ITVnE-NTFv4_SxgJZPUrWyYkt22zY6teZ-TGgV_ZN7nulXYbEXw/s400/cover.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&quot;Additional_Topics&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Additional Topics&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The topics of lattice theory and order theory are extensive and this post really just scratches the surface.  When you feel comfortable or even if you don’t depending on your learning style, there are many things that I did not cover.  There are order specific concepts like strict and asymmetric. Complete partial orders show up a lot in CS as well.  For lattices there are things that I only mentioned like modularity and Galois connections, there functions on lattices which include ideas like monotone, antitone, and isotone.  New lattice can be created by number of techniques like the Cartesian product of two lattices.  And of course there are many interesting results relating to fixed points, and the list goes on.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;In my next post I will look at some specific examples of some the ideas discussed here in everyday programming and some more theoretical examples as well.&lt;/p&gt;&lt;br /&gt;
&lt;a name=&quot;References_and_Resources&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;References and Resources&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;There are a number of books on the subject, including the previously mentioned  the recently updated &lt;u&gt;Lattice Theory: Foundation &lt;/u&gt; by George Grätzer and &lt;u&gt;Combinatorics: The Rota Way&lt;/u&gt; by Joseph P. S. Kung, Gian-Carlo Rota and Catherine H. Yan, there are a number of books on the subject including:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Lattices and Ordered Algebraic Structures by T.S. Blyth&lt;/li&gt;
&lt;li&gt;Introduction to Lattices and Order by B. A. Davey and H. A. Priestley&lt;/li&gt;
&lt;li&gt;General Lattice Theory (Second Edition) by George Grätzer, B.A. Davey, R. Freese and B. Ganter&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;If you are just getting into the subject, and even if you are not, I would recommend taking advantage of some good free resources, listed in no particular order:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.149.3551&quot;&gt;Lattice Theory with Applications&lt;/a&gt;  by Vijay K. Garg&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.math.hawaii.edu/~jb/&quot;&gt;Notes on Lattice Theory&lt;/a&gt;[&lt;a href=&quot;bigcheese.math.sc.edu/~mcnulty/alglatvar/lat.pdf&quot;&gt;complete pdf here&lt;/a&gt;] by J. B. Nation of the University of Hawaii&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://boole.stanford.edu/cs353/handouts/book1.pdf&quot;&gt;Chapter 1 - Lattice theory&lt;/a&gt; in Vaughan Pratt’s &lt;a href=&quot;http://www.cs.utexas.edu/~diz/353/&quot;&gt;CS 353: Algebraic Logic&lt;/a&gt; course &lt;a href=&quot;http://boole.stanford.edu/cs353/handouts.html&quot;&gt;handouts&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Dave Abrams &quot;&lt;a href=&quot;http://cpp-next.com/archive/2010/02/order-i-say/&quot;&gt;Order I Say&lt;/a&gt;&quot; blog post, some of the above images are from his post, with his permission, thanks.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.iseclab.org/people/enji/infosys/lattice_tutorial.pdf&quot;&gt;Lattice Tutorial&lt;/a&gt; by Nenad Jovanovic of Secure Systems Lab&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.math.cornell.edu/~levine/18.312/alg-comb-lecture-7.pdf&quot;&gt;Lecture 7&lt;/a&gt; and &lt;a href=&quot;http://www.math.cornell.edu/~levine/18.312/alg-comb-lecture-7.pdf&quot;&gt;lecture 8&lt;/a&gt; of Lionel Levine’s course on &lt;a href=&quot;http://www.math.cornell.edu/~levine/18.312/&quot;&gt;Algebraic Combinatorics&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://profs.sci.univr.it/~giaco/paperi/lattices-for-CS.pdf&quot;&gt;Chapter 2 - Ordered Sets and Complete Lattices, A Primer for Computer Science&lt;/a&gt; by Hilary A. Priestley of  the Mathematical Institute, University of Oxford&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.ams.org/notices/199711/comm-rota.pdf&quot;&gt;The Many Lives of Lattice Theory&lt;/a&gt; by Gian-Carlo Rota&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://mathworld.wolfram.com/topics/LatticeTheory.html&quot;&gt;Wolfram’s Mathworld on lattices&lt;/a&gt;&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/09/lattice-theory-for-programmers-and-non.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-G0o_LMo9saE_POQ1N2b4XT-2MOllZYUcbM629gvp1VQErjZFYfuIw5gK-WTIHpfveW_7oIChRVftMbKQw763xerear6oeel5PiyiRiGwmwBTy13h-eABAxFiIwt2xzwCv4MfxMqZWZvC/s72-c/monarch.jpg" height="72" width="72"/><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-2890494797010662089</guid><pubDate>Tue, 07 Aug 2012 12:35:00 +0000</pubDate><atom:updated>2014-06-20T10:40:20.516-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Computer Science</category><category domain="http://www.blogger.com/atom/ns#">Education</category><category domain="http://www.blogger.com/atom/ns#">Math</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Rant</category><category domain="http://www.blogger.com/atom/ns#">Software Development</category><category domain="http://www.blogger.com/atom/ns#">Software Development Teams</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><category domain="http://www.blogger.com/atom/ns#">Software Process</category><title>Why You Can’t Have a Real Software Engineering Discipline</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhizGX42GAT3QQJXs8388Hkk2GqOEFcSrRTNLHvBYvKEZZ0OhPwW1zzO4ujOzcQ3ntaNYyjcVfvuZniNYwOo7tZqjAgu0bHj_mgzCZkoRu5Z8IHqEqEgt80lp9dMsjkx1ka_OWhgZ2-myET/s1600/IMG_7870.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhizGX42GAT3QQJXs8388Hkk2GqOEFcSrRTNLHvBYvKEZZ0OhPwW1zzO4ujOzcQ3ntaNYyjcVfvuZniNYwOo7tZqjAgu0bHj_mgzCZkoRu5Z8IHqEqEgt80lp9dMsjkx1ka_OWhgZ2-myET/s400/IMG_7870.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;!--Why You Can’t Have a Real Software Engineering Discipline--&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;As we all know the fields of computer science and software engineering are in their infancies.  Many a blog post has been written lamenting the fact that software engineering is not a real engineering discipline, and while I have not written that exact post, I have &lt;a href=&quot;http://www.elegantcoding.com/2011/12/metaphorically-thinking-about-software.html&quot;&gt;written about the subject&lt;/a&gt; and have &lt;a href=&quot;http://www.elegantcoding.com/2012/01/real-software-engineering-good-bad-and.html&quot;&gt;deconstructed what others have said&lt;/a&gt; about it.  A number of these points do apply to why software projects routinely fail, yet another topic that has received considerable attention.  Now admittedly all engineering disciplines regardless of their maturity and formalization have project failures and creating a real software engineering discipline will not eliminate this problem but one would hope that it would abate it.&lt;/p&gt;&lt;p&gt;I find it odd that at a time when so many people are involved in IT there seems to be little discernible progress in creating a real software engineering disciple.  There are probably millions of people working on creating software.  Also there are many researchers trying to solve this problem from many different angles.  Practitioners have been attempting to solve it with ideas like Agile and Software Craftsmanship, etc.  Additionally there is a long list of failures surrounding the formalization software engineering.  &lt;/p&gt;&lt;p&gt;My biggest complaint is the fact that there really are no good formal standards in general software engineering principles and methodologies lack a formal foundation and even the more vague principles can be easily thwarted and misused, and often, as I have &lt;a href=&quot;http://www.elegantcoding.com/2012/03/software-design-debate-and-futility-of.html&quot;&gt;previously complained&lt;/a&gt;, it often ends up being based on pure opinion which is usually won through positional authority, perseverance or by those who are just more politically savvy.&lt;/p&gt;&lt;p&gt;The intent of this post is not to attempt to solve or even offer solutions to the problem of creating a real software engineering discipline but to look at what I think are some barriers to creating this discipline and in some of these cases offer thoughts on overcoming those barriers.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Low Entry Requirements&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;If we are to think software engineering as an engineering discipline, I challenge you to find another engineering discipline that routinely has practitioners with no formal training in the field.  I very much doubt that someone who did not hold a degree in engineering and who built a shed in his back yard is now working as a structural engineer on a construction project, the mere idea seems ludicrous.  Yet I have worked with non technical degree holders who became software developers, one who started by building web pages and now calls himself an &quot;Internet Application Architect&quot;, and is probably one of the biggest &lt;a href=&quot;http://www.elegantcoding.com/2011/10/confederacy-of-cargo-cult-coders.html&quot;&gt;cargo cult coders&lt;/a&gt; I’ve ever had the misfortune to work with.  This egalitarian aspect isn’t all bad as it does let good people into the field as well.   Another non technical degree holder I once worked with became an accomplished developer and went on to get an advanced degree in CS and is now a CS professor.   Although it’s probably the case that for every good non technical degree holder who joins the field it is likely that dozens of mediocre and bad practitioners will also join.   It seems that in other engineering disciplines there are much more stringent educational requirements to ensure proper training.   To be clear here I am not equating having a degree with being competent because I have met many &lt;a href=&quot;http://www.elegantcoding.com/2011/07/certificate-industry.html&quot;&gt;incompetent people with degrees&lt;/a&gt;, but still you need something.   I confess I am at a loss for a solution for this one.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;The Lack of Differentiation between Science and Engineering&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Chemistry is a scientific discipline, chemical engineering is an engineering discipline, and you can make this comparison between other engineering disciplines and the sciences that they employ e.g. electrical, mechanical, and structural map to various areas of physics.  Engineering and scientific disciplines are different types of disciplines often taught in separate schools.  Although each engineering discipline has some scientific overlap and it would probably be possible to move from the appropriate scientific field to the corresponding engineering field in general you probably would not do so without returning to school.   In recent years software engineering curricula have been added to the rosters of many colleges and while this is potentially a step forward, discounting for the moment that software engineering is still not really real engineering, a software engineering degree and a computer science degree in many cases gets you the same job!   &lt;/p&gt;&lt;p&gt;So in other fields there would be a differentiation between a degree that would put you on a track to do scientific research and one that would put you on a track to do engineering work.  As I understand it, if you are fresh out of school with a BS in CS that qualifies you to be a tester at Microsoft&lt;sup&gt;1&lt;/sup&gt;, developers hired right out of school need at least a Masters degree in CS.   This is an extreme case of how this really breaks down in our industry.  In most cases engineering practitioners are the software engineering, MIS, CS or even non technical degrees and the few scientific careers generally go to the advanced degree holders.  I admit this probably fairly normal a BS in chemistry or biology is also more likely to get you a job in IT than a job as a research scientist.  Still compared to more mature engineering fields there seems to be a lack of real differentiation between the degrees that yield a career as a software engineer versus one as a computer scientist.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;Bad Management&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;The entry requirements for managers in software make the low entry requirements for software engineering practitioners look downright rigorous.  I have &lt;a href=&quot;http://www.elegantcoding.com/2011/05/driven-development.html&quot;&gt;previously criticized&lt;/a&gt; the fact that many organizations find the cheapest people, especially for software management and give them an &lt;a href=&quot;http://www.pmi.org/certification/project-management-professional-pmp.aspx&quot;&gt;obligatory certification&lt;/a&gt;.  Now I know that engineering management regardless how formal or established the engineering discipline is an area that has problems and failures, but again I very much doubt that you would find a twenty something business or liberal arts major with a freshly minted PMP suffix managing construction or civil works projects.   Yet in my experience this is pretty normal in IT especially in the government sector.  Of course bad software management is executed by older managers as well.&lt;/p&gt;&lt;p&gt;A post by Larry White titled &quot;&lt;a href=&quot;http://deathrayresearch.tumblr.com/post/26759934886/engineering-management-is-dying&quot;&gt;Engineering Management Is Dying&quot;&lt;/a&gt; delves into some these issues.  It is definitely the case that methodologies like Agile have changed how software projects work and the traditional corporate management approach to software really doesn’t work.  One point he makes is that it is not uncommon to see a two hundred person project at Google headed by an engineer.  To me this implies that someone is in some way managing that project.  I think all of this is indicative of the need for software engineering mangers to also be practitioners in engineering or at least very well versed in how software development works.  The situation he talks about at Google is not the case everywhere, in that case the company is its own client, but there are many cases where software is being built for clients and this does create a need for management that deals with the client, perhaps this should be a role that is separated from management and called a client liaison, which is what often happens.  Also I am not sure how things work at Google but I have also seen internal development in organizations where the IT department provides services to an internal client, I have also seen this go horribly awry with contentious unproductive relationships between departments.  In short I feel that just as we need a real software engineering discipline we also need a real incarnation of software engineering management.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;The Disconnect between Academia and Industry&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;Most practitioners do not keep up with, or read academic research, actually many practitioners don’t read at all, but that’s &lt;a href=&quot;http://www.elegantcoding.com/2011/10/confederacy-of-cargo-cult-coders.html&quot;&gt;another issue&lt;/a&gt;, and most academicians don’t work in the field so they lack the hands on knowledge.  Unfortunately this rift can take on a somewhat disdainful tone as is the case in my exploration of one practitioner’s attempt to define &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/01/real-software-engineering-good-bad-and.html&quot;&gt;Real Engineering&lt;/a&gt;&quot;.   Fortunately some people, I’d like to count myself among them, take a more constructive approach to building bridges across this rift.  Daniel Lemire has an interesting &lt;a href=&quot;http://lemire.me/blog/archives/2012/06/18/on-the-quality-of-academic-software/&quot;&gt;critique the quality of software produced in academia&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;I think the solution here is for both sides to become more engaged in problems faced on each side. I am optimistic about this one as I feel that these walls are breaking down as the field is growing up and many of the emerging technologies are forcing developers to be more cognizant of and engaged in research topics.  I also have encountered much more research that has ties to the practical concerns of day to day software development, some I have &lt;a href=&quot;http://www.elegantcoding.com/2011/07/software-frameworks-resistance-isnt.html&quot;&gt;mentioned&lt;/a&gt; with more to come.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;The Lack of an Effective CS Math Curriculum  &lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;If you read my blog you know it to be a mix of math and software practices. I would describe myself as a software practitioner and a math enthusiast.  My math journey has taken me on some interesting math excursions into areas of math that seem to get little or no mention in CS curricula and I feel that this is a major problem in really applying math to the field of software engineering.  Another problem is in the way that it is taught, my experience was that it was not only taught badly but in a way that made it seem irrelevant to many of the programming courses.  Specifically I would shift the CS math curriculum to include less differential and integral calculus and include more logic, combinatorics, abstract algebra, graph theory, order theory, category theory and probably some topology among others.&lt;/p&gt;&lt;p&gt;Over the last few years I have been progressively learning more math which has been in part motivated by necessity for understanding research papers.  This approach has changed the way I see things, I now see the patterns of math in software. They are there and I believe that they can be exploited to create a real software engineering discipline.&lt;/p&gt;&lt;p&gt;For the math learning problem I do have some ideas many of which are expressed in my blog.  Some of my posts like &lt;a href=&quot;http://www.elegantcoding.com/2011/04/math-you-can-use.html&quot;&gt;refactoring if statements with Demorgan’s Laws&lt;/a&gt; or the &lt;a href=&quot;http://www.elegantcoding.com/2011/05/monoid-for-masses.html&quot;&gt;String Monoid&lt;/a&gt;, the &lt;a href=&quot;http://www.elegantcoding.com/2011/08/object-graph.html&quot;&gt;Object Graph&lt;/a&gt;, etc. are about making these mathematical ideas more relevant and accessible to programmers. Other posts like my series on &lt;a href=&quot;http://www.elegantcoding.com/2012/05/software-system-morphology.html&quot;&gt;naming&lt;/a&gt; and my post on &lt;a href=&quot;http://www.elegantcoding.com/2012/04/what-is-generic-programming.html&quot;&gt;generic programming&lt;/a&gt; and &lt;a href=&quot;http://www.elegantcoding.com/2012/02/software-reuse-complexity-curve.html&quot;&gt;entropy and complexity&lt;/a&gt; are about my own ideas and ideas in the research literature that I feel may help to create a real software engineering discipline.  These are my attempts at solutions to these problems, so expect more of both of these and more thoughts on the CS math curriculum.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;The Software Architect Debacle&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;This is one that really bothers me.  I feel the software architect role in general has a very negative effect on creating quality software and it dissuades the industry from developing a real engineering discipline.  The Software Architect role tends to be broadly defined, you have enterprise architects, software architects, etc., some architects tend to be involved with hardware and networking, some work on configuration management, some do software design, some do all of these things and more.  I feel this is a problem as each of these is a separate engineering area with different types of problems. By not breaking these down it often leads to a lack of focus on specific problems, also I have seen cases where the architect focuses on their preference and ignores other issues.  The architect role is often divorced from the code.  I have met many architects that were responsible for software but had never even looked at the code.  To me this is a huge failing that architects that are responsible for building software often lack the interest, time, or even aptitude to know the quality or underlying of structure of the software that they are delivering.&lt;/p&gt;&lt;p&gt;To really do justice to these ideas I might need a separate post, my solution would be to break down the architect role into specific engineering roles, which could include:&lt;/p&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Software Process Engineering&lt;/b&gt; - this would be involved with software team and resources planning, some aspects of configuration management such as defining policies, requirements analysis and general project management aspects of software construction including the definition and refinement of the SDLC.  This role is tightly coupled with software engineering management.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Software Structural Engineering&lt;/b&gt; - this would include requirements comprehension, code infrastructure planning, prototyping work, hands on code structural work including custom frameworks and reusable components, third party library products, and general code quality including reviews and static analysis.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Software Quality Engineering&lt;/b&gt; - This would include the QA roles, software testing and testing tools, requirements validation and refinement, usability and reliability and general software quality issues.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Software Infrastructure Engineering&lt;/b&gt; - This would include hardware, networking, database, app server and general service infrastructure, non functional requirements fulfillment and possibly the implementation of configuration management, continuous integration, etc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;This is a rough &quot;sketch&quot; of these possible roles and each of these areas has some overlap implying that all of the people in these roles would work closely together, also some combination of, or all of these roles might be performed by a single individual depending on the organization’s size and structure.  What this approach does is clearly defines roles and responsibilities as opposed to some nebulous software architect role.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;The Continuous Turnover of the Work Force&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;A young CEO once commented that he thinks young programmers are superior.  In general companies prefer younger workers as they often don’t have family commitments so they can work more hours and you can pay them lower salaries, DC area government contractors rely on this to keep their profit margins up.&lt;/p&gt;&lt;p&gt;As an older developer I often find this frustrating.  I confess that I have not moved up the ladder and still mostly work as a developer or what might be called a hands on architect, yes I know but that’s the current term, actually my preferred title would be: Software Structural Engineer.  Working as a contractor I have on several occasions found myself on projects that were dominated by younger developers and unfortunately on more than one occasion I watched as teams would make many mistakes due to a lack of experience, in some cases I was able to help in others I was ignored by the younger developers.  This is not to say that I do not still make mistakes, I’ve just been around long enough to have made a lot of them already.&lt;/p&gt;&lt;p&gt;If you buy into the software craftsmanship thing, I admit to being skeptical of this idea, you might be inclined to draw a parallel to craftsman of the past when older established masters took on apprentices and passed on their wisdom to the next generation.  Given the access to information these days such process is somewhat antiquated and perhaps impractical.  Nevertheless I feel, and the industry supports me here, that older developers who keep their skills up to date have value.  I know several younger developers who have sought me out to learn from me so I think I can safely say I still have some value.&lt;/p&gt;&lt;p&gt;Many older developers have let their skills get rusty and have not kept up on current technologies I have seen this many times.  Also many companies seem to lack the vision to allow for real hands on technical career growth.  I can’t help but feel that this inclination to recycle developers in each new generation is hurting or at least slowing our ability to develop a real software engineering discipline, this potential loss of continuity seems like it leads to some lost wisdom.&lt;/p&gt;&lt;br /&gt;
&lt;h3&gt;The Social Networking Drain and Hollywoodification of Silicon Valley&lt;/h3&gt;&lt;br /&gt;
&lt;p&gt;As I write this Hollywood gears up to deliver a &lt;a href=&quot;http://www.nytimes.com/2012/07/10/technology/silicon-valley-wary-of-reality-series.html&quot;&gt;reality TV show&lt;/a&gt; that takes place in silicon valley and Mark Zuckerberg now gets the &lt;a href=&quot;http://gawker.com/5597293/mark-zuckerbergs-age-of-privacy-is-over-+-gallery/&quot;&gt;paparazzi treatment&lt;/a&gt;.  Another article that I &lt;a href=&quot;http://www.elegantcoding.com/2011/07/certificate-industry.html&quot;&gt;previously mentioned&lt;/a&gt; was about how CS enrollment was up because the movie The Social Network had enticed many aspiring Zuckerberg wannabes.  At present there does seem to be a gold rush mentality and it is noticeable and even discussed on sites like &lt;a href=&quot;http://news.ycombinator.com/&quot;&gt;Hacker News&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;As someone who has never worked in the valley I am very much an outsider and may not have a good perspective on these things, but it seems that there are a lot of startup companies focusing on crap. Now I get it.  We live in a shallow consumer society with a rapacious appetite for crap. But are not these supposed to be some of the smartest people and I am &lt;a href=&quot;http://www.businessinsider.com/entrepreneurs-should-be-solving-real-problems-not-creating-apps-2012-3&quot;&gt;not the only one to wonder&lt;/a&gt; why so many smart people who should have better taste and higher standards are settling for working on serving up ads and other vapid crap instead of doing more meaningful work like working on real problems that would advance human society or even just work on advancing software engineering. &lt;/p&gt;&lt;!--
 Maybe I’m just jaded, so I will leave you with this and of course my apologies to &lt;a href=&quot;http://en.wikipedia.org/wiki/Allen_Ginsberg&quot;&gt;Allen Ginsberg&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I saw the best minds of my generation wasted by working on serving up ads,&lt;/p&gt;&lt;p&gt;dragging themselves through the startups in the valley looking for an instant cash fix,&lt;/p&gt;&lt;p&gt;angelheaded hipsters burning for the venture capital connection to the better life in the consumer culture,&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href=&quot;http://www.wussu.com/poems/agh.htm&quot;&gt;...&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;--&gt;&lt;br /&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt;I believe this was the case in the late 90’s and may have changed, this information was conveyed to me by a former Microsoft employee.&lt;/p&gt;&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2012/08/why-you-cant-have-real-software.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhizGX42GAT3QQJXs8388Hkk2GqOEFcSrRTNLHvBYvKEZZ0OhPwW1zzO4ujOzcQ3ntaNYyjcVfvuZniNYwOo7tZqjAgu0bHj_mgzCZkoRu5Z8IHqEqEgt80lp9dMsjkx1ka_OWhgZ2-myET/s72-c/IMG_7870.JPG" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-1158803292085313812</guid><pubDate>Tue, 17 Jul 2012 19:10:00 +0000</pubDate><atom:updated>2012-07-18T09:22:09.491-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Naming</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><title>A Framework for Software System Naming</title><description>&lt;h2&gt;On the Importance of Naming in Software Systems part IV&lt;/h2&gt;&lt;style&gt;
li.listitem {
    margin-bottom : 16px;
    padding-bottom: 16px;
}&lt;/style&gt;&lt;!--A Framework for Software System Naming--&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIvQmi6RIwxmR-9ta5V2FV1zDvlsadp8HoyCWJlvxbzEtjycvUdIuBXMhL8bvqYpNUENrg8azmLmwj2DEeyMNsIZl0tNkhu8od15tWeiD4LQ6QmffUrv-Rwe6EWc3A2ipqoe4kzI2GIKqq/s1600/ce11_Callisto.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIvQmi6RIwxmR-9ta5V2FV1zDvlsadp8HoyCWJlvxbzEtjycvUdIuBXMhL8bvqYpNUENrg8azmLmwj2DEeyMNsIZl0tNkhu8od15tWeiD4LQ6QmffUrv-Rwe6EWc3A2ipqoe4kzI2GIKqq/s400/ce11_Callisto.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;In my previous posts on naming I have laid the foundation for a framework for naming in software systems.  This post is mostly a rehashing of those previous ideas and is intended to both codify and consolidate the definitions of terms upon which I have chosen and created to build a naming framework.  It also serves as a single location to concisely reference these ideas.  To gain more insight into the background and development of these ideas see my previous three posts:  &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/03/survey-of-conventional-wisdom-on.html&quot;&gt;A Survey of the Conventional Wisdom on Software Naming&lt;/a&gt;&quot;,  &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/03/more-thoughts-on-formal-approaches-to.html&quot;&gt;More Thoughts on Formal Approaches to Naming in Software&lt;/a&gt;&quot;, and &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/05/software-system-morphology.html&quot;&gt;Software System Morphology&lt;/a&gt;&quot;.  The definitions are as follows:&lt;/p&gt;&lt;h3&gt;Structural&lt;/h3&gt;&lt;ul&gt;&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;Name&lt;/b&gt; – The Signifier that consists of a string of characters that refers to a &lt;b&gt;System Referent&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;Name Unit Separator&lt;/b&gt; – is a mechanism to separate name units within a &lt;b&gt;Name&lt;/b&gt;, this can be an explicit character such as &quot;-&quot; or &quot;_&quot;.  It can also be in implicit mechanism such as the use of Camel Case within the name.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;Name Unit&lt;/b&gt; – Is the smallest lexical unit of a &lt;b&gt;Name&lt;/b&gt; usually separated by a &lt;b&gt;Separator&lt;/b&gt; (&lt;b&gt;Name Unit Separator&lt;/b&gt;) and is used to describe the lexical structure of the &lt;b&gt;Name&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;Named Scope Context&lt;/b&gt; – this is the location of the &lt;b&gt;Name&lt;/b&gt; within the system, e.g. where the name usage occurs.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;System Referent&lt;/b&gt; – This is the actual instance of a thing that is named and is used in the system. See &lt;b&gt;System Referent Type&lt;/b&gt; for specific types of &lt;b&gt;System Referents&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;System Referent Type&lt;/b&gt; - This is the specific type or class, as in classification, of what a &lt;b&gt;System Referent&lt;/b&gt; is in a system some examples include:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Classes&lt;/li&gt;
&lt;li&gt;Variables (local, instance, static)&lt;/li&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Method Parameters&lt;/li&gt;
&lt;li&gt;Packages&lt;/li&gt;
&lt;li&gt;Database Tables, Columns, Triggers, Stored Procedures, etc.&lt;/li&gt;
&lt;li&gt;HTML Files, CSS Files, Javascript Files, Config Files, all files&lt;/li&gt;
&lt;li&gt;Directories&lt;/li&gt;
&lt;li&gt;Urls&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;XML Elements and Attributes&lt;/li&gt;
&lt;li&gt;CSS Classes&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h3&gt;Semantic&lt;/h3&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;System Morpheme&lt;/b&gt; – This is a conceptual unit of meaning in a system that is used in a name, it is distinguished from a &lt;b&gt;Name Unit&lt;/b&gt; in that a morpheme can consist of one or more &lt;b&gt;Name Units&lt;/b&gt;.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;System Natural Language Set&lt;/b&gt; – This is the set of Natural Languages used to create the names.  It is often English but it need not be and a system could include components or be constructed in a way that might include hybridization between multiple natural languages.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;Problem Domain&lt;/b&gt; - This is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Semantic_domain&quot;&gt;Semantic Domain&lt;/a&gt; that describes problem area for which the system solution is targeted.  This would be a set of concepts and &lt;b&gt;System Morphemes&lt;/b&gt; that apply to the problem domain. For example a financial system would be built using the relevant financial terms and language concepts.&lt;/li&gt;
&lt;li style=&quot;padding-bottom: 16px;&quot;&gt;&lt;b&gt;Solution Domain&lt;/b&gt; – This is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Semantic_domain&quot;&gt;Semantic Domain&lt;/a&gt; that describes concepts that are used to implement the system including &lt;b&gt;System Morphemes&lt;/b&gt; that apply to the solution domain.  This might include things like terms that describe Design Patterns, data structures, etc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;As you can see from above these Ideas can be separated into two categories: Structural and Semantic. However the two categories are not completely independent of each other so there is some overlap and interdependence.  The structural ideas include: &lt;b&gt;Name Unit&lt;/b&gt;, &lt;b&gt;Named Scope Context&lt;/b&gt;, &lt;b&gt;System Referent&lt;/b&gt;, and a &lt;b&gt;System Referent Type&lt;/b&gt;.   Each &lt;b&gt;Name&lt;/b&gt; has these properties as attributes.  A name has a lexical structure made up of &lt;b&gt;Name Units&lt;/b&gt;, and refers to a &lt;b&gt;System Referent&lt;/b&gt; of some &lt;b&gt;System Referent Type&lt;/b&gt; and has one or more locations given by its &lt;b&gt;Named Scope Context&lt;/b&gt;(s).&lt;/p&gt;&lt;p&gt;The semantics of the names which has the &quot;unit&quot; described by the &lt;b&gt;System Morpheme&lt;/b&gt; idea has semantic properties which will fall into either the &lt;b&gt;Problem Domain&lt;/b&gt; or the &lt;b&gt;Solution Domain&lt;/b&gt;.  The expression of these concepts is dependent on the &lt;b&gt;System Natural Language Set&lt;/b&gt;, in other words the natural languages that are used to construct meaningful names for concepts in both the &lt;b&gt;Problem Domains&lt;/b&gt; and the &lt;b&gt;Solution Domains&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;This is the current state of my thinking on this. These ideas will be refined and might change over time, the objective is to develop something that is useful and that both supports and can be validated by a more analytic approach.&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/07/framework-for-software-system-naming.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIvQmi6RIwxmR-9ta5V2FV1zDvlsadp8HoyCWJlvxbzEtjycvUdIuBXMhL8bvqYpNUENrg8azmLmwj2DEeyMNsIZl0tNkhu8od15tWeiD4LQ6QmffUrv-Rwe6EWc3A2ipqoe4kzI2GIKqq/s72-c/ce11_Callisto.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-3474665736560025259</guid><pubDate>Sun, 15 Jul 2012 12:45:00 +0000</pubDate><atom:updated>2012-07-15T08:45:16.449-04:00</atom:updated><title>Renaissance 2.0</title><description>&lt;br /&gt;
&lt;p&gt;Are We on the Verge of the Next Renaissance?&lt;/p&gt;&lt;!--Renaissance 2.0--&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRY8YglVI21u9ibyvDes1NVoocHeqMTkkEKw4Daxpy5iJNrMyYWabvpBzX9b5JRJV_gUo5YieRHkGgf7YDDk30O6qEC6xEn7ROFKKsJgwtW0wuAtNTgzxqOc5o234ENBjQ88ObEsLCXXMS/s1600/The_Papal_Belvedere.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;309&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRY8YglVI21u9ibyvDes1NVoocHeqMTkkEKw4Daxpy5iJNrMyYWabvpBzX9b5JRJV_gUo5YieRHkGgf7YDDk30O6qEC6xEn7ROFKKsJgwtW0wuAtNTgzxqOc5o234ENBjQ88ObEsLCXXMS/s400/The_Papal_Belvedere.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;On 31 October 1517, &lt;a href=&quot;http://en.wikipedia.org/wiki/Martin_Luther&quot;&gt;Martin Luther&lt;/a&gt; sent to his bishop &lt;a href=&quot;http://en.wikipedia.org/wiki/Albert_of_Mainz&quot; title=&quot;Albert of Mainz&quot;&gt;Albert of Mainz&lt;/a&gt; a copy of his &amp;quot;Disputation of Martin Luther on the Power and Efficacy of Indulgences&amp;quot;, which came to be known as &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Ninety-Five_Theses&quot; title=&quot;The Ninety-Five Theses&quot;&gt;The Ninety-Five Theses&lt;/a&gt;.  In January of 1518 he also sent copies to his friends who translated it from Latin to German and had copies printed and passed them on.  In part because of easy mechanized printing it went viral, within two weeks it had spread throughout Germany and in a month throughout all of Europe. The rapid propagation of his leaked private communication caught Luther by surprise and he soon found himself in a full on “flame-war” directly with the &lt;a href=&quot;http://en.wikipedia.org/wiki/Pope_Leo_X&quot;&gt;Pope&lt;/a&gt;.  Luther quickly mastered this new mass media and effectively used it in his fight.  This early landmark public dispute in the emergent mass media of the time demonstrated a new power structure built on the rapid spread of ideas.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Johannes_Gutenberg&quot;&gt;Guttenberg&lt;/a&gt;’s motivation for inventing the &lt;a href=&quot;http://en.wikipedia.org/wiki/Printing_press&quot;&gt;printing press&lt;/a&gt;, an idea that had also been invented previously in Asia, was strictly entrepreneurial and it was not his first venture. Shortly after the introduction of the printing press to Europe, other entrepreneurs realized that there was a demand for books.  In some respects the printing business of the late 15&lt;sup&gt;th&lt;/sup&gt; and early 16&lt;sup&gt;th&lt;/sup&gt; centuries was very similar to the internet boom that we are currently experiencing.  This new technology not only caused the creation of new businesses but it also transformed the dissemination of information and the power of information itself in the sense that new information could be more easily created and collaboratively built and referenced also language was standardized and local &lt;a href=&quot;http://en.wikipedia.org/wiki/Vernacular&quot;&gt;vernacular&lt;/a&gt; languages replaced Latin for scholarly works.  This new more egalitarian access to books and information fueled the spread of ideas, and caused an exponential surge forward in the ability develop science and technology and culture itself.&lt;sup&gt;1&lt;/sup&gt;&lt;/p&gt;&lt;p&gt;There was a dark side to this new change in the way information was disseminated. The Catholic Church, which held a monopoly on the dissemination of religious information&lt;sup&gt;2&lt;/sup&gt;, reacted by banning some of the books and publishing its own propaganda including lists of banned books, also the &lt;a href=&quot;http://en.wikipedia.org/wiki/Tyndale_Bible&quot;&gt;Tyndale Bible&lt;/a&gt; written in English was banned in England until &lt;a href=&quot;http://en.wikipedia.org/wiki/Henry_VIII_of_England&quot;&gt;Henry VIII&lt;/a&gt; broke with the Catholic Church.  An &lt;a href=&quot;http://en.wikipedia.org/wiki/Inquisition&quot;&gt;inquisition&lt;/a&gt; was directed towards the book publishing capital of Europe, Venice, due to the publication of scientific books which contradicted the beliefs of the Roman Catholic Church.  Books were banned and burned and heresy trials were held. &lt;/p&gt;&lt;p&gt;There were several &lt;a href=&quot;http://en.wikipedia.org/wiki/Inquisition&quot;&gt;inquisitions&lt;/a&gt; which were heinous affairs that included racial cleansing, torture, and other barbaric acts of terror. These were started before the advent of the printing press but were then directed towards this new threat. Fortunately the inquisitions eventually died out. &lt;/p&gt;&lt;p&gt;It is thought that this transformation in the spreading of ideas, coupled with the previous reintroduction of earlier &lt;a href=&quot;http://en.wikipedia.org/wiki/Transmission_of_the_Classics&quot;&gt;Greek, Roman and Arabic knowledge&lt;/a&gt; fuelled an expansion of scientific understanding which also transformed art in terms of perspective and anatomical representation was a catalyst for the Renaissance.  All of this makes me wonder about the future possibilities of our current era and what similar parallels we could see from that previous “information technology” revolution when the dissemination of information made an exponential leap forward from the old technology, much the same way as we are experiencing an exponential leap forward in information technology.&lt;/p&gt;&lt;p&gt;We now live in an era in which I can download hundreds of books or the equivalent amount of information in minutes more than I can comprehend and software is rapidly evolving to allow me to more effectively deal with large quantities of data I can search, jump, skim, and view almost anything about any subject effectively instantly, the time that it takes to send text, audio, images and video has been reduced almost to the speed of light and that’s how quick we can get real time information from all over the world and from space. We also continuously receive an increasing amount of data from various places in the solar system and even at the &lt;a href=&quot;http://en.wikipedia.org/wiki/Voyager_program&quot;&gt;edge&lt;/a&gt; of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Heliosphere&quot;&gt;heliosphere&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;The very tools to better manipulate crunch and comprehend large petabyte and beyond data are rapidly being invented and refined, the things that we will be able to do in even the next decade(s) is probably going to be revolutionary for human society in terms of art, science and how we live our lives, the changes are already quite pronounced.  Soon images, audio, and video will be as searchable and easily manipulated as text is now and algorithms enhanced with more and more math will be able to digest all of this and allow us to query it and manipulate it ways we probably can’t even imagine yet. &lt;/p&gt;&lt;p&gt;From the sixteenth century until the end of the twentieth century publishing grew into a vast industry expanding from books to encompass more such as periodicals. Other entire industries were spawned from it such as the newspaper industry.  This spawned new media like audio, radio and recording, movies and video that grew into entire industries.  Then along came the internet and fast data transmission. All of these industries are now under pressure and many are fighting this change.  Now it would be a bit overly dramatic to compare the copyright wars to the inquisition but the parallel is there: large organizations in control of the dissemination of information fighting the change, more egalitarian information access and distribution.  Another common thread is the use of law, the Catholic Church tried to impose its law on the local European governments to stamp out heresy.  We now find ourselves in a similar position with the established media companies using their deep pockets to attempt to write new laws that benefit them at the potential cost to a free internet and innovation, so far legislation like the &lt;a href=&quot;http://en.wikipedia.org/wiki/Research_Works_Act&quot;&gt;Research Works Act&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Stop_Online_Piracy_Act&quot;&gt;SOPA&lt;/a&gt; have failed but the fight continues.  Patents especially broad and abstract patents are another threat to innovation this is another system that has been gamed by the big corporations so that it now often does the opposite of the original intent of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Founding_Fathers_of_the_United_States&quot;&gt;founding fathers&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So we now find ourselves at a unique time where there is so much potential for innovation in science and art and hopefully society. These human endeavors are built on collaboration and on the sharing, remixing, and refining of ideas. Many of Shakespeare’s works were derivative of earlier works, can you imagine if the same type of laws and litigation existed then, such works may have never been created.&lt;/p&gt;&lt;p&gt;How this potential innovation will it play out over the next two decades may very well be beyond comprehension, the things I can buy today were the devices of science fiction, specifically Star Trek, when I was growing up, even as a young adult, the idea of having a thousand books on a tablet device or watching real time video from the space station or access to terabytes of data was almost beyond my expectation, yet now I am starting to take it for granted.  My childhood almost seems like the life of a 15&lt;sup&gt;th&lt;/sup&gt; century turnip farmer who could only dream of reading scientific or any knowledge in a book.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt; Much of this is excerpted from Episode 4 of &lt;u&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/The_Day_the_Universe_Changed&quot;&gt;The Day the Universe Changed&lt;/a&gt;&lt;/u&gt; by James Burke &lt;/p&gt;&lt;p&gt;&lt;sup&gt;2&lt;/sup&gt;The bible and all sermons were held in Latin restricting non-ecclesiastical people direct access religious doctrine.&lt;/p&gt;&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2012/07/renaissance-20.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRY8YglVI21u9ibyvDes1NVoocHeqMTkkEKw4Daxpy5iJNrMyYWabvpBzX9b5JRJV_gUo5YieRHkGgf7YDDk30O6qEC6xEn7ROFKKsJgwtW0wuAtNTgzxqOc5o234ENBjQ88ObEsLCXXMS/s72-c/The_Papal_Belvedere.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-2241176499456609810</guid><pubDate>Mon, 28 May 2012 21:37:00 +0000</pubDate><atom:updated>2012-08-30T21:21:44.816-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linear Algebra</category><category domain="http://www.blogger.com/atom/ns#">Logic</category><category domain="http://www.blogger.com/atom/ns#">Math</category><category domain="http://www.blogger.com/atom/ns#">Probability Theory</category><category domain="http://www.blogger.com/atom/ns#">Vector Space Model</category><title>The Math of Search and Similarity</title><description>&lt;!--Math of Search and Similarity--&gt;&lt;br /&gt;
&lt;h2&gt;Part one: Lucene, The Boolean Model, tf*idf, and the Vector Space Model&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQdPOpXCZBZm-RTDhpvo6SMAcEX7g-RDBkCPQI8Q48kAXDsR5gY4CwR2RcthOlVIQOMkNqY8v7q3LigSgOqNO8mpB8ThyJaPNm_wIEF2yT5dVR-tmCEvWr5cWJXcq9FRBLSRTB7_sKOT1F/s1600/resize_IMG_3632.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQdPOpXCZBZm-RTDhpvo6SMAcEX7g-RDBkCPQI8Q48kAXDsR5gY4CwR2RcthOlVIQOMkNqY8v7q3LigSgOqNO8mpB8ThyJaPNm_wIEF2yT5dVR-tmCEvWr5cWJXcq9FRBLSRTB7_sKOT1F/s400/resize_IMG_3632.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a href=&quot;http://lucene.apache.org/&quot;&gt;Lucene&lt;/a&gt; is built on classic &lt;a href=&quot;http://en.wikipedia.org/wiki/Information_retrieval&quot;&gt;IR (Information Retrieval)&lt;/a&gt; Math concepts that are actually pretty old by current standards in our industry, with most of its roots from the 1970’s and some of them like the Boolean Model being quite a bit older.  Still that’s a solid quarter century older than search techniques like &lt;a href=&quot;http://en.wikipedia.org/wiki/PageRank&quot;&gt;Pagerank&lt;/a&gt; and yet it can be a central and almost necessary technology used in many systems.&amp;nbsp; The mathematical domain of searching in Lucene relies on ideas like similarity measures which also relates to other disciplines that are used in &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_mining&quot;&gt;Data Mining&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Machine_learning&quot;&gt;Machine learning&lt;/a&gt;.&amp;nbsp; The basic ideas of Lucene and IR provide a nice introduction to these ideas and I want to focus on the following classic IR topics:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Standard_Boolean_model&quot;&gt;The Boolean Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Vector_Space_Model&quot;&gt;The Vector Space Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tf*idf&quot;&gt;tf*idfweighting (Term Frequency * Inverse Document Frequency)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;h2&gt;Tokenizing Text&lt;/h2&gt;&lt;br /&gt;
Lucene is built on the idea of Documents, which can be thought of as a collection of terms.&amp;nbsp; Think of a document as a web page or book and think of the terms as the words and in some cases phrases.&amp;nbsp; Lucene uses an Analyzer to tokenize the text, for example you may want not want to include Stop Words like [the, and, to, a, ...] in your index also indexes can be built using the concept of &lt;a href=&quot;http://en.wikipedia.org/wiki/N-gram&quot;&gt;N-Grams&lt;/a&gt; take the expression &quot;Information Retrieval&quot; for example, you might want to treat this as a single term as opposed to breaking it up, there are also Analyzers that do &lt;a href=&quot;http://en.wikipedia.org/wiki/Stemming&quot;&gt;Stemming&lt;/a&gt; and even &lt;a href=&quot;http://en.wikipedia.org/wiki/Phonetics&quot;&gt;phonetic&lt;/a&gt; &lt;a href=&quot;http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilter.html&quot;&gt;analysis&lt;/a&gt;.&amp;nbsp; The tokenizing process is involved but that should give you a basic idea, more can be found &lt;a href=&quot;http://futupark.wordpress.com/2008/04/01/text-analysis-inside-lucene/&quot;&gt;here&lt;/a&gt;.&amp;nbsp; Tokenization allows the terms to be defined, identified and parsed and it is the properties of terms in relation to the documents which drive the Boolean Model, the Vector Space Model and tf*idf.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;The Boolean Model&lt;/h2&gt;&lt;br /&gt;
The Boolean Model treats documents as vectors of boolean indicators, this is a brief summary of ideas discussed in chapter one of &lt;u&gt;&lt;a href=&quot;http://nlp.stanford.edu/IR-book/pdf/01bool.pdf&quot;&gt;Introduction to Information Retrieval&lt;/a&gt;&lt;/u&gt;, I am borrowing part of the example from that chapter:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;&amp;nbsp;                         &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;Antony and Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;Julius Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;The Tempest&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;Hamlet &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;Othello &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;Macbeth&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Antony &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;1&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Brutus &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;1&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Calpurnia&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
This is an &lt;a href=&quot;http://en.wikipedia.org/wiki/Incidence_matrix&quot;&gt;incidence matrix&lt;/a&gt; that shows which terms are in which documents.&amp;nbsp; This representation can be viewed as either a set of columns which form binary vectors indicating which term occurs in each document or it can be viewed as a set of binary term-vectors which shows which shows which documents contain a given term.&amp;nbsp; This example is also a bit deceiving in that these vectors will be pretty &lt;a href=&quot;http://en.wikipedia.org/wiki/Sparse_vector&quot;&gt;sparse&lt;/a&gt;, The Tempest and Othello document vectors (columns) and the Cleopatra and Calpurnia term vectors (rows) are more indicative of this sparseness at this small scale.&amp;nbsp; Whether we store and search this data as a full matrix or individual vectors it would require a lot of space and the space would be mostly zeros, so a better structure to store and search this is used, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Inverted_index&quot;&gt;inverted index&lt;/a&gt;, the details of which are covered in chapter one of &lt;u&gt;Introduction to Information Retrieval&lt;/u&gt; and Apendix B of &lt;u&gt;Lucene in Action&lt;/u&gt;.&lt;br /&gt;
&lt;br /&gt;
The queries on this structure take the form of standard Boolean logic including: Logical Conjunction, Logical Disjunction and Logical Negation.  An example is (again taken from &lt;u&gt;Introduction to Information Retrieval&lt;/u&gt; with some notational modification):&lt;br /&gt;
&lt;br /&gt;
To answer the query we create a vector (q) [Brutus AND Caesar AND NOT Calpurnia], we take the Boolean vectors for Brutus (b), Caesar (c&lt;sub&gt;s&lt;/sub&gt;) and Calpurnia (c&lt;sub&gt;l&lt;/sub&gt;), complement the last, and then do a bitwise AND, where all Boolean vector operation are bitwise operations, this can all be denoted as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheC3QP2WP8lk31xU7ZAu5l7ahVx8uvt7yp8i1PLkql4nXz4xl7fXdU9IUSReg2dP84JMA6Kxx0Dwh7EnVsHnr0Dy4BjDnpemZ0DZl6orsC8zEdhZNIRaxmX71dvIYgb1XvvZqh-EkMmaF_/s1600/brutus.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;21&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheC3QP2WP8lk31xU7ZAu5l7ahVx8uvt7yp8i1PLkql4nXz4xl7fXdU9IUSReg2dP84JMA6Kxx0Dwh7EnVsHnr0Dy4BjDnpemZ0DZl6orsC8zEdhZNIRaxmX71dvIYgb1XvvZqh-EkMmaF_/s400/brutus.png&quot; width=&quot;127&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8AsvK3nKgW_ArgLG7O2kGe6ZXGoqhQOs4TT8mb7dF2A1BKanml3-Ir2T22Tm7a9XjZ2OK4Yncs5xo48spi3ZAGw64hgog3sXxfpJdt98EEAiE83AzA71v0NjyulGYYNAoMIq4q5pvJHgC/s1600/caeser.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8AsvK3nKgW_ArgLG7O2kGe6ZXGoqhQOs4TT8mb7dF2A1BKanml3-Ir2T22Tm7a9XjZ2OK4Yncs5xo48spi3ZAGw64hgog3sXxfpJdt98EEAiE83AzA71v0NjyulGYYNAoMIq4q5pvJHgC/s400/caeser.png&quot; width=&quot;135&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeFqL-zAvIs7SOcyBrKpfZL4VGqGsA075V4JFVar1zgC1MkGo1_D0GPJiDueXXuPI589ELVAlcdS7WqDk5NIQ__PfzKxtOefsKvHXC1eJfQPRRCdw3FnY11gHuFLzAGPcuCPAT7xIB3dNr/s1600/Calpurnia.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeFqL-zAvIs7SOcyBrKpfZL4VGqGsA075V4JFVar1zgC1MkGo1_D0GPJiDueXXuPI589ELVAlcdS7WqDk5NIQ__PfzKxtOefsKvHXC1eJfQPRRCdw3FnY11gHuFLzAGPcuCPAT7xIB3dNr/s400/Calpurnia.png&quot; width=&quot;133&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW_ox1rmGkALvbAeK5WGKy7Dm_FEuXaKAGJPvw6P8czXdbUowbwA9-4DcyPfqNCyomRGi1kSv3Ga0quj6oMI7IVJ6AYBoeoXq6K07thWWKekSRR9CJaH1jTqIaCRFeVE2dI92vJ-Oq1C5d/s1600/query.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;21&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW_ox1rmGkALvbAeK5WGKy7Dm_FEuXaKAGJPvw6P8czXdbUowbwA9-4DcyPfqNCyomRGi1kSv3Ga0quj6oMI7IVJ6AYBoeoXq6K07thWWKekSRR9CJaH1jTqIaCRFeVE2dI92vJ-Oq1C5d/s400/query.png&quot; width=&quot;112&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWp6QmOR8Z9INoXhsWbPQj6FYEzRv7q0SsdsAk0YRFjFnCfj5RLJjyT5n2OG6v7ss9RBLn8fpxW-4kNUlCQ_oV30nn9OiG7ut0StADzvgPmAxqfxZkyB4bmMM-WFNBAGqctxnwnrVZKl9G/s1600/query1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWp6QmOR8Z9INoXhsWbPQj6FYEzRv7q0SsdsAk0YRFjFnCfj5RLJjyT5n2OG6v7ss9RBLn8fpxW-4kNUlCQ_oV30nn9OiG7ut0StADzvgPmAxqfxZkyB4bmMM-WFNBAGqctxnwnrVZKl9G/s400/query1.png&quot; width=&quot;375&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLnSupCBshOM3zlkwMiMeohaEF4W2UryUl69ThCfrQY2yB6hUtEl-rBlCZBm9Nxw4g1C_s4LWPtwm70WP7Q9LaCQDMxmU_PBOV2Nuh37AARFC6VlxzH5Ffcy1vjKw7slEY0f-fklO8CY9/s1600/query2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;14&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkLnSupCBshOM3zlkwMiMeohaEF4W2UryUl69ThCfrQY2yB6hUtEl-rBlCZBm9Nxw4g1C_s4LWPtwm70WP7Q9LaCQDMxmU_PBOV2Nuh37AARFC6VlxzH5Ffcy1vjKw7slEY0f-fklO8CY9/s400/query2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
The resulting term vector for this query yields: &lt;i&gt;[Antony and Cleopatra, Hamlet]&lt;/i&gt; vector positions one and four.&lt;br /&gt;
&lt;br /&gt;
In the above example you can see using the column vectors shows how the inverted index structure works. Here we are indexing into the corpus based on the terms not on the documents. So where a document is usually a collection terms (a column) we have inverted this document/term relationship and are now using the term/document relationship to link to the documents (rows). The inverted index structure in Lucene is built on listing terms and then linking to the documents, in Lucene each document is given an integer document id, so each term has a list of document ids that contain the document. The inverted index structure can include other information such as the position in the document or other metadata.&lt;br /&gt;
&lt;br /&gt;
The inverted index is the same concept as something known as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Concordance&quot;&gt;concordance&lt;/a&gt;, which is a list of words and their positions in a work used by scholars. A famous example is one that was published for the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dead_Sea_Scrolls&quot;&gt;Dead Sea scrolls&lt;/a&gt; by the team who exclusively controlled them, but the published images of the scrolls at a very slow pace which left many unpublished and this created a researcher monopoly on the scripts which upset many researchers who did not have access.  In 1988 Ben Zion Wacholder used a computer to reconstruct 17 documents from the concordance, these were published in 1991.&amp;nbsp; Coincidently the same month a complete set of facsimiles were discovered at the Huntington Library and published breaking the monopoly on the scrolls, they are now available &lt;a href=&quot;http://dss.collections.imj.org.il/&quot;&gt;free on online&lt;/a&gt;, as they should be.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;tf*idf Weighting (Term Frequency*Inverse Document Frequency)&lt;/h2&gt;&lt;br /&gt;
tf*idf stands for Term Frequency – Inverse Document Frequency which is basically the Term Frequency multiplied by the Inverse Document Frequency.&amp;nbsp; In 1972 Karen Sparck Jones published a paper proposing what has become known as Inverse Document Frequency (idf) it is defined as:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3pipmDVpBE5i35KGn6Zf53tq6cie8qd_M6v_1t-OeuqnmP9S78l8-F-5mhVaZAtw4RvddApu2J4Clg64NQdDQm5AzTJVKcGrnTUq4CiylC20kwqmVl4ISdY-BNPMhsoNPyWYlxscschss/s1600/idf.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;39&quot; width=&quot;119&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3pipmDVpBE5i35KGn6Zf53tq6cie8qd_M6v_1t-OeuqnmP9S78l8-F-5mhVaZAtw4RvddApu2J4Clg64NQdDQm5AzTJVKcGrnTUq4CiylC20kwqmVl4ISdY-BNPMhsoNPyWYlxscschss/s400/idf.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Where |D| is the size of the set of all of the documents and |d&lt;sub&gt;t&lt;/sub&gt;| is the number of documents that contain the term, this formula is effectively the log of the inverse of the estimated (&lt;a href=&quot;http://en.wikipedia.org/wiki/Uniform_distribution&quot;&gt;uniform&lt;/a&gt;) probability that a term will occur in a document, which would be given by the formula:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAV7khChFruZtSfjxsjDGIhVUSN6dW5W_Q1DLWAp3MvYYIJQnaAkfQBIEY-DInEaMaprSBKFe9etg7AeGfgft1Ncz3tFP3IRhj0ibI-uEU3MbSR7tiffJBiKnIfhyn-H0egseYcaprbfsG/s1600/term-prob.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;39&quot; width=&quot;89&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAV7khChFruZtSfjxsjDGIhVUSN6dW5W_Q1DLWAp3MvYYIJQnaAkfQBIEY-DInEaMaprSBKFe9etg7AeGfgft1Ncz3tFP3IRhj0ibI-uEU3MbSR7tiffJBiKnIfhyn-H0egseYcaprbfsG/s400/term-prob.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
This can be rewritten as:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguV-y2DVLW09e_2AK-aQ2-zSC0XVXr8-XIg48qrhDLwuNRC0EZDaNH8S5GbazsjddvPLLxhD2k6FHiOMPfhzBL4wG5tgTopo6VBAZ-oIiCBGbH_R-eDIb8hcVTPiG5h50yw9GDu22ZXDBd/s1600/idf-prob.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;127&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguV-y2DVLW09e_2AK-aQ2-zSC0XVXr8-XIg48qrhDLwuNRC0EZDaNH8S5GbazsjddvPLLxhD2k6FHiOMPfhzBL4wG5tgTopo6VBAZ-oIiCBGbH_R-eDIb8hcVTPiG5h50yw9GDu22ZXDBd/s400/idf-prob.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Using the &lt;a href=&quot;http://www.elegantcoding.com/2011/10/ologn.html&quot;&gt;logarithmic identity&lt;/a&gt;, this is needed since a log of a probability, which is less than or equal to one, will always be either a negative value or zero:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_8sRfoTmgpQcUOO6O-NK-2ryKfjrXcUBtj8U9W_4K_-i2PrQstGi0klWd11MGQ0Bvmpg8bj1qJ6lbCplqggrIeatfktoiB8f9EY5ik-TkuzbzpO2ef7j7H1BZJgdAto_US_MD5h67Xqx1/s1600/log-inv.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;41&quot; width=&quot;140&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_8sRfoTmgpQcUOO6O-NK-2ryKfjrXcUBtj8U9W_4K_-i2PrQstGi0klWd11MGQ0Bvmpg8bj1qJ6lbCplqggrIeatfktoiB8f9EY5ik-TkuzbzpO2ef7j7H1BZJgdAto_US_MD5h67Xqx1/s400/log-inv.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The interesting thing about using logs is that it makes the idf terms addable for example if we want to compute the Inverse Document Frequency for term one and(&amp;wedge;) term two, assuming they are mutually exclusive which means the probability P(x &amp;wedge; y) = P(x)P(y) is multiplicative:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu1AWFfm97eN9H0KOHz4MmsWoE6cIk8WcFs7zG-M9QyscyKrIiJLsnVabszRVDaTh4aoOezuHvk7W4Q_yb0cANKaTxq13X4BNtI8nZmE_tnxn12dTBG8pFHp4SozOtSwD7ULhrw8tXQOX4/s1600/idf-der1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;219&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu1AWFfm97eN9H0KOHz4MmsWoE6cIk8WcFs7zG-M9QyscyKrIiJLsnVabszRVDaTh4aoOezuHvk7W4Q_yb0cANKaTxq13X4BNtI8nZmE_tnxn12dTBG8pFHp4SozOtSwD7ULhrw8tXQOX4/s400/idf-der1.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSRYbbCVwCp4DAmvbmZK0uIHbAml7pndQ_MmhoXVlD7adZ9i4m55NeoPBSpFqjeKvc083CPia0cKj5vPAOqEj93aBdYljoDk6tVX1EFg7DnQcEA853NOQbtjIw6Bkb9ttxBrs96ucqmRkE/s1600/idf-der2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;239&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSRYbbCVwCp4DAmvbmZK0uIHbAml7pndQ_MmhoXVlD7adZ9i4m55NeoPBSpFqjeKvc083CPia0cKj5vPAOqEj93aBdYljoDk6tVX1EFg7DnQcEA853NOQbtjIw6Bkb9ttxBrs96ucqmRkE/s400/idf-der2.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV5z09hsuHTWmcA4818en62J1bkona0nI6CMM8qxstpfkhHke8FpbnL9eMapjZFiNUdcbdPU161JpISscg3uyIgxDB_YsMB_C8fien39S559j2HP6bg_0lEHfov0cVRYpYpJ-OZi0Da0-Q/s1600/idf-der3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;295&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgV5z09hsuHTWmcA4818en62J1bkona0nI6CMM8qxstpfkhHke8FpbnL9eMapjZFiNUdcbdPU161JpISscg3uyIgxDB_YsMB_C8fien39S559j2HP6bg_0lEHfov0cVRYpYpJ-OZi0Da0-Q/s400/idf-der3.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs8iBuvvcxAVRgnnbuHkLkQPErzuMNFLCDxAhVi_boUnaTIdaR1gh3ZQKmzh-0ZJUWHOOU76qm_EvMCErttCJPiaxcvd-GvX5S-uZZ3sjoYyxgrNwTz1Kcw_JWXjiWPFmV2NCBEznMiEPv/s1600/idf-der4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;217&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs8iBuvvcxAVRgnnbuHkLkQPErzuMNFLCDxAhVi_boUnaTIdaR1gh3ZQKmzh-0ZJUWHOOU76qm_EvMCErttCJPiaxcvd-GvX5S-uZZ3sjoYyxgrNwTz1Kcw_JWXjiWPFmV2NCBEznMiEPv/s400/idf-der4.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The additive property is due to another logarithmic identity, which also forms a group &lt;a href=&quot;http://en.wikipedia.org/wiki/Isomorphism&quot;&gt;isomorphism&lt;/a&gt; between multiplication of positive real numbers and addition of real numbers:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga9TNKiow7d-4KCMyi0UufW0qrY8p9hGXKLHEvYlxVp1Oaq18ESEfGKO1gM5oAXDR1GCex23uyb5xIdQR9jVfnMbbH6G1KOJzyBSGlRT4-MSfzHvJAgZHuCbwRM-a9Mx4WlU2AtI9v5s4P/s1600/log-ident-add.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;17&quot; width=&quot;182&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEga9TNKiow7d-4KCMyi0UufW0qrY8p9hGXKLHEvYlxVp1Oaq18ESEfGKO1gM5oAXDR1GCex23uyb5xIdQR9jVfnMbbH6G1KOJzyBSGlRT4-MSfzHvJAgZHuCbwRM-a9Mx4WlU2AtI9v5s4P/s400/log-ident-add.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Now to get tf*idf we need to multiply the Term Frequency which is the number of times the term occurs in the document with the Inverse Document Frequency, the complete formula is:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTcvm8aoeX9aCOfIFHOuS5n07CnQo2WfdgUHTC-zT9IS3Q3l2IlHPZMa2N6BytHBZ3ZiCgv3ii_OjL9cttBAAziI3a1Ay3BsHVXC-ZF2F2S3gAbWnELquynhdFcJOL1nsgh1VQQLRetlyP/s1600/tf-idf.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;39&quot; width=&quot;159&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTcvm8aoeX9aCOfIFHOuS5n07CnQo2WfdgUHTC-zT9IS3Q3l2IlHPZMa2N6BytHBZ3ZiCgv3ii_OjL9cttBAAziI3a1Ay3BsHVXC-ZF2F2S3gAbWnELquynhdFcJOL1nsgh1VQQLRetlyP/s400/tf-idf.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
When I learned about this I immediately thought of the formula for &lt;a href=&quot;http://en.wikipedia.org/wiki/Information_theory&quot;&gt;Information Theory&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jRgBM-7-pUmoCrbmHQmah4gUfabgqX_wjWAnUmEdlIHRrwD-_gcPT-_ouVR82iUGulqHI5uGnPK9DRjvg9KgNa1xtsWKOk4aiiacuCaMYLcWXKBgcp2uqDJBtcu710vQPztr4NFnTNrC/s1600/info-theory.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;46&quot; width=&quot;359&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2jRgBM-7-pUmoCrbmHQmah4gUfabgqX_wjWAnUmEdlIHRrwD-_gcPT-_ouVR82iUGulqHI5uGnPK9DRjvg9KgNa1xtsWKOk4aiiacuCaMYLcWXKBgcp2uqDJBtcu710vQPztr4NFnTNrC/s400/info-theory.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
It turns out that this has been thought of and debated and is not really correct, a topic that is fairly involved and you can read more about it this &lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.97.7340&quot;&gt;paper&lt;/a&gt; by Stephen Robertson.  The ideas above about the logarithmic properties of addition in idf are taken from this paper.&lt;br /&gt;
&lt;br /&gt;
Basically tf*idf is a term weighting mechanism which maps documents and terms to real numbers and we need this for the next piece of the puzzle.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-P2xAirFb588dAj-nydLyAgvtkd6H3a2-FlTA2ohuWYt5yUqMqvwqWjcUg4QuJEbiAeuY6WlmpX6R4SxqgLbLhc5Ao0zQ_RDeDcahtuJehYDZTzOv5TzJ8xHNUD1TQ0yec8_SjHvxLtpB/s1600/Vector_space_model.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;393&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-P2xAirFb588dAj-nydLyAgvtkd6H3a2-FlTA2ohuWYt5yUqMqvwqWjcUg4QuJEbiAeuY6WlmpX6R4SxqgLbLhc5Ao0zQ_RDeDcahtuJehYDZTzOv5TzJ8xHNUD1TQ0yec8_SjHvxLtpB/s400/Vector_space_model.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The Vector Space Model&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
One problem with the Boolean model is that it either gives too many results or too few.&amp;nbsp; In the example above a Shakespearean &quot;micro-corpus&quot; was used to demonstrate how it works but in real corpus a query like that could potentially retrieve thousands of documents which would make it impractical to attempt to wade through the result set. &amp;nbsp;This is where a weighting mechanism like tf*idf comes in, it effectively maps the boolean values to values in the domain of &lt;a href=&quot;http://en.wikipedia.org/wiki/Real_number&quot;&gt;Real Numbers&lt;/a&gt;, well technically floating point numbers. &amp;nbsp;The vector space model uses the columns of the incidence matrix above which are the vectors of terms for each document where each term position in the vector is calculated using the tf*idf weighting scheme.&amp;nbsp; These document vectors exist in a Vector Space and a query can be constructed as a vector and each document can be compared to the query vector using the angles between the query vector and the document vectors (&amp;alpha;, &amp;theta;) to determine which documents (d&lt;sub&gt;1&lt;/sub&gt;,d&lt;sub&gt;2&lt;/sub&gt;) best answer a query (q), shown visually above.&amp;nbsp; Also you should note that this is a simple two dimensional example, in reality there will be a dimension for each additional term which becomes a hyperdimensional vector space consisting of hundreds or even thousands of dimensions.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
It is not the angle between vectors that is calculated but the cosine of the angle, which is known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cosine_similarity&quot;&gt;Cosine Similarity&lt;/a&gt;, this is used as it is easier to calculate than the angle itself, the formula is:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh03i2u43jQxSUGAu10pzZp1XTfCAJOveD9f2ge2ePio-O3D7kwdN5UBeel0kcUhDU96JJDAyos_xC6zKkmB6vA7s09rDwSM_ukt3JWGbYb5thx9904ckLYOTlnj4U4OfIPh-AJBq7Hm9QO/s1600/cosine.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;38&quot; width=&quot;229&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh03i2u43jQxSUGAu10pzZp1XTfCAJOveD9f2ge2ePio-O3D7kwdN5UBeel0kcUhDU96JJDAyos_xC6zKkmB6vA7s09rDwSM_ukt3JWGbYb5thx9904ckLYOTlnj4U4OfIPh-AJBq7Hm9QO/s400/cosine.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The numerator is the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dot_product&quot;&gt;Dot Product&lt;/a&gt; of the two vectors, a query vector and a document vector, the denominator is the product of the Euclidean &lt;a href=&quot;http://en.wikipedia.org/wiki/Norm_%28mathematics%29&quot;&gt;Norm&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/Magnitude_%28mathematics%29#Euclidean_vectors&quot;&gt;Magnitude&lt;/a&gt; of the two vectors.&amp;nbsp; The above equation can be written as follows with the expanded Dot Product and Euclidean Norm calculations:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk6i-OTwCE4WVQfKwU_Sou1B0zrlaO56O17B2_BSfCu1d0PweNLYuGU7ir3wSPH64ov3fX0xagYT4uPS-CUzQNhtJI56T3wHNyNnr4nccoawgM4kmPH50GHIkSmhmQ-TZEdugwl1Xq9tRe/s1600/cos-sim.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;94&quot; width=&quot;277&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk6i-OTwCE4WVQfKwU_Sou1B0zrlaO56O17B2_BSfCu1d0PweNLYuGU7ir3wSPH64ov3fX0xagYT4uPS-CUzQNhtJI56T3wHNyNnr4nccoawgM4kmPH50GHIkSmhmQ-TZEdugwl1Xq9tRe/s400/cos-sim.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
tf*idf is designed to increase as the number of occurrences of the term increase in a given document It should also be noted that the Vector Space Model can be built with other term weighting mechanisms other than tf*idf. &amp;nbsp;More information can be found in &quot;&lt;a href=&quot;http://www.miislita.com/information-retrieval-tutorial/cosine-similarity-tutorial.html&quot;&gt;Cosine Similarity and Term Weight Tutorial&lt;/a&gt;&quot;, in &lt;a href=&quot;http://nlp.stanford.edu/IR-book/pdf/06vect.pdf&quot;&gt;chapter six of Introduction to Information Retrieval&lt;/a&gt; and Lucene specific information on &lt;a href=&quot;http://lucene.apache.org/core/3_6_0/scoring.html&quot;&gt;scoring&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Extending our example from above we can calculate our weights, first the idf values:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;&amp;nbsp;                     &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;49&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; D&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d&lt;sub&gt;t&lt;/sub&gt;&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Idf&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Antony &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;49&quot;&gt;6&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;3&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;0.69314718&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Brutus &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;49&quot;&gt;6&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;3&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;0.69314718&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;49&quot;&gt;6&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;5&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;0.18232155&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Calpurnia&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;49&quot;&gt;6&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;1.79175946&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;49&quot;&gt;6&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;108&quot;&gt;1.79175946&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
From a &lt;a href=&quot;http://www.opensourceshakespeare.org/concordance/&quot;&gt;Shakespearean concordance&lt;/a&gt; we can get the number of occurrences for each term:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;&amp;nbsp;                         &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;Antony and Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;Julius Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;The Tempest&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;Hamlet &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;Othello &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;Macbeth&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Antony &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;157&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;61&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;1&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Brutus &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;3&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;112&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;159&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;145&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;2&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;1&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;1&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Calpurnia&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;10&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;56&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;73&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Using the idf values and term frequencies we can calculate tf*idf for our documents:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;&amp;nbsp;                         &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;Antony and Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;Julius Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;The Tempest&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;Hamlet&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;Othello&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;Macbeth&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Antony &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;108.82410&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;42.281978&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0.69314718&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Brutus &lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;2.0794415&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;77.632484&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0.69314718&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Caesar&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;28.989127&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;26.436625&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0.36464311&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0.18232155&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0.18232155&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Calpurnia&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;17.917594&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;tr&gt;   &lt;td valign=&quot;top&quot; width=&quot;72&quot;&gt;Cleopatra&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;100.33853&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;78&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;76&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;   &lt;td valign=&quot;top&quot; width=&quot;85&quot;&gt;0&lt;/td&gt;  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
I will leave calculating a query as an exercise for you, if you are feeling so inclined or masochistic.&lt;br /&gt;
&lt;br /&gt;
Lucene uses a &lt;a href=&quot;http://lucene.apache.org/core/old_versioned_docs/versions/3_0_2/api/core/org/apache/lucene/search/Similarity.html&quot;&gt;combination of the Boolean Model and the Vector Space Model&lt;/a&gt;, when the query is run the documents are first &quot;approved&quot;, selected, by the Boolean Model and then scored by The Vector Space Model. &amp;nbsp;I believe this approach offers two advantages. &amp;nbsp;First it would reduce the number of calculations to search the Vector Space since you aren’t really searching it and limiting your calculations to a subset. &amp;nbsp;Secondly the Vector Space Model does not handle negation in queries, and I am not sure how negation is handled in Lucene in regards to scoring.&amp;nbsp; Actually there have been a number of IR tweaks and improvements for flexibility and efficiency that have been incorporated into Lucene and I confess I have only scratched the surface in both my coverage here and current knowledge.&lt;br /&gt;
</description><link>http://www.elegantcoding.com/2012/05/math-of-search-and-similarity.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQdPOpXCZBZm-RTDhpvo6SMAcEX7g-RDBkCPQI8Q48kAXDsR5gY4CwR2RcthOlVIQOMkNqY8v7q3LigSgOqNO8mpB8ThyJaPNm_wIEF2yT5dVR-tmCEvWr5cWJXcq9FRBLSRTB7_sKOT1F/s72-c/resize_IMG_3632.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-3572137304010579924</guid><pubDate>Sun, 13 May 2012 19:24:00 +0000</pubDate><atom:updated>2012-05-13T15:46:23.720-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linguistics</category><category domain="http://www.blogger.com/atom/ns#">Morphology</category><category domain="http://www.blogger.com/atom/ns#">Naming</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><category domain="http://www.blogger.com/atom/ns#">Software Frameworks</category><title>Software System Morphology</title><description>&lt;!--Software System Morphology--&gt;&lt;h2&gt;On the Importance of Naming in Software Systems, part III&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJpwA0FvR13lEjkBeNVxRnFaZN_bqn6EaYc5bmUY0D-A3JyO3yhNJHnZP36Pr6CXAGDo2LzsRTFReAcoicLCVR0VwdZU8D5nCWfYtI8IsNI52uDJK6pqa_mLLfhgMi5IzQCxX-eDB-uU4f/s1600/europa_galileo.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;267&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJpwA0FvR13lEjkBeNVxRnFaZN_bqn6EaYc5bmUY0D-A3JyO3yhNJHnZP36Pr6CXAGDo2LzsRTFReAcoicLCVR0VwdZU8D5nCWfYtI8IsNI52uDJK6pqa_mLLfhgMi5IzQCxX-eDB-uU4f/s400/europa_galileo.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;In my previous posts on naming &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/03/survey-of-conventional-wisdom-on.html&quot;&gt;A Survey of the Conventional Wisdom on Software Naming&lt;/a&gt;&quot; and &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/03/more-thoughts-on-formal-approaches-to.html&quot;&gt;More Thoughts on Formal Approaches to Naming in Software&lt;/a&gt;&quot; I discussed several ideas about defining a way to talk about software system naming, I feel the name &quot;Software System Morphology&quot; captures this &quot;big picture&quot; concept. My objective is to develop a comprehensive way to define and analyze the &lt;a href=&quot;http://en.wikipedia.org/wiki/Semantics&quot;&gt;semantic&lt;/a&gt; nature (&lt;a href=&quot;http://en.wikipedia.org/wiki/Morphology_(linguistics)&quot;&gt;morphology&lt;/a&gt;) of the construction of a software system. It’s an ambitious undertaking and whether or not I succeed in this endeavor I am hoping that these ideas will contribute to a better solution to this problem.&lt;/p&gt;&lt;p&gt;To review, I am defining three attributes that a name of signifier can have, the &lt;b&gt;&lt;i&gt;name scope context&lt;/i&gt;&lt;/b&gt;, i.e. where the name is used or occurs, the type or class of the &lt;b&gt;&lt;i&gt;system referent&lt;/i&gt;&lt;/b&gt; signified by the name, and the lexical structure of the name i.e. the &lt;a href=&quot;http://en.wikipedia.org/wiki/N-gram&quot;&gt;n-gram&lt;/a&gt; of &lt;b&gt;&lt;i&gt;name units&lt;/i&gt;&lt;/b&gt;.  I feel that these three qualities can be used to determine and possibly measure aspects of the morphological structure of software and by determining the morphological structure of a software system that structure might be &amp;quot;comprehended&amp;quot; and refined which could yield higher quality software.  &lt;/p&gt;&lt;p&gt;In Linguistics a &lt;a href=&quot;http://en.wikipedia.org/wiki/Morpheme&quot;&gt;morpheme&lt;/a&gt; is the smallest unit of meaning and it is considered, by some, to be a complete sub-discipline of the study of Linguistics. I admit that I am in the process of learning more about it, I am a few chapters into &lt;u&gt;What is Morphology&lt;/u&gt; by Mark Aronoff and Kirsten Fudeman it is an excellent book for linguistic neophytes like me.  &lt;b&gt;&lt;i&gt;Software System Morphology&lt;/i&gt;&lt;/b&gt; will both be divergent and dependent on &lt;a href=&quot;http://en.wikipedia.org/wiki/Natural_language&quot;&gt;natural language&lt;/a&gt; morphological concepts, which are quite complex.  However a general understanding of linguistic morphology will make these ideas more accessible, I suggest looking into it on your own, it’s fascinating and worth it solely on its own merits.  A quick example of English Morphology can be given with the morphologically complex word autobiography which consists of the morphemes: auto/bio/graph/y, where [auto] means &quot;self&quot;, [bio] means &quot;life&quot;, [graph] means &quot;drawn&quot; and [y] means &quot;characterized by&quot;. &lt;/p&gt;&lt;p&gt;In my first post of this series I explored various ideas proposed by a few prominent software engineers, one idea that I discussed was the use of what were denoted as qualifiers which included the scope qualifier, the type qualifier and the computed-value qualifier. These qualifiers which are prefixed or suffixed to names can be thought of more generally as morphemes. So we can now incorporate those ideas into a more general way of looking at meaning in software naming. Now the natural conclusion, if you have been paying attention, may be to assume that the name unit concept will map to the morpheme concept, it does not, at least in terms of only software morphology and this is in interesting distinction, software morphemes may consist of n-grams of name units which can be natural language morphemes two examples are CommandPattern and MedicalRecord where separating these into individual name units potentially become meaningless in certain software contexts.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;i&gt;Software System Morphology&lt;/i&gt;&lt;/b&gt; is primarily influenced by three things, the semantic nature of the &lt;b&gt;&lt;i&gt;problem domain&lt;/i&gt;&lt;/b&gt;(s), the semantic nature of the &lt;b&gt;&lt;i&gt;solution domain&lt;/i&gt;&lt;/b&gt;(s), which include languages ORMs, paradigms, design patterns, data structures, and finally the natural language(s) in which both the &lt;b&gt;&lt;i&gt;problem domain&lt;/i&gt;&lt;/b&gt; and &lt;b&gt;&lt;i&gt;solution domains&lt;/i&gt;&lt;/b&gt; are expressed. The previous example items CommandPattern and MedicalRecord illustrate these ideas as well.  &lt;/p&gt;&lt;p&gt;Ok now let’s take our concepts further with a more detailed example.  Assume we have a Hospital Medical system which has the following &lt;b&gt;&lt;i&gt;problem domain&lt;/i&gt;&lt;/b&gt; concepts: [Medical Record, Patient, Visit, Doctor, Hospital, Address, Invoice]. Obviously there are more. For the &lt;b&gt;&lt;i&gt;solution domain&lt;/i&gt;&lt;/b&gt; we will assume a JEE/Spring style implementation which might include the following concepts: [Entity, Dao, ServiceLayer, Controller, Map, View].  Now some expected names (signifiers) might be: MedicalRecordEntity, PatientEntity, PatientServiceLayer, PatientDao, PatientController, PatientView, VisitEntity, VisitDao, VisitServiceLayer, VisitController, VisitView, PatientVisitMap, PatientHospitalVisitor,... Now as you can see the names are composed of morphemes from both the &lt;b&gt;&lt;i&gt;problem domain&lt;/i&gt;&lt;/b&gt; and the &lt;b&gt;&lt;i&gt;solution domain&lt;/i&gt;&lt;/b&gt;.  This is to be expected as each name tells what it is/does in the &lt;b&gt;&lt;i&gt;problem domain&lt;/i&gt;&lt;/b&gt; and what it is/does in the &lt;b&gt;&lt;i&gt;solution domain&lt;/i&gt;&lt;/b&gt;. In fact any developer with knowledge of JEE Spring Web application developer can look at these names and know what to expect and where they fit in the system.  Additionally it is easy to look at the above set of domain concepts and anticipate &lt;b&gt;&lt;i&gt;named system referents&lt;/i&gt;&lt;/b&gt; that I omitted.&lt;/p&gt;&lt;p&gt;Previously I pointed out that the idea referred to as a qualifier is really a morpheme and while this is true the term qualifier seems to denote a more contextual setting in terms of the domain concepts.  In the above examples the &lt;b&gt;&lt;i&gt;solution domain&lt;/i&gt;&lt;/b&gt; morphemes act as qualifiers telling where and how each &lt;b&gt;&lt;i&gt;named system referent&lt;/i&gt;&lt;/b&gt; fits into the solution Entity tells that it is a domain object, Dao tells that it relates to persistence, ServiceLayer tells that one would expect to see a &lt;a href=&quot;http://en.wikipedia.org/wiki/Separation_of_concerns&quot;&gt;separation of concerns&lt;/a&gt; that would put the &lt;a href=&quot;http://en.wikipedia.org/wiki/Business_Logic&quot;&gt;business logic&lt;/a&gt; here. Structurally one would expect the domain objects (with the Entity suffix) to be passed back from the Dao’s and ServiceLayer’s and there might be transformative manipulation or aggregation of the domain objects in the ServiceLayer.  The idea of qualification is meaning based but in this case it also indicates structural aspects of the &lt;b&gt;&lt;i&gt;solution domain&lt;/i&gt;&lt;/b&gt;. In this example I intentionally use the Entity suffix, in many systems the domain concepts would be used alone i.e. [Patient, Visit], I have mixed feelings about this in one sense it can be viewed as potentially unnecessary, in another sense it represents a qualifier that can possibly improve comprehension. Qualifiers do make names longer and while I tend to favor longer names it can become problematic if they get too long.  These ideas towards naming are powerful for building comprehensible maintainable code as you can see from the above name examples that they follow a consistent pattern, admittedly these are fairly easy naming tasks, but you would be surprised how many developers fail to even do these types of things consistently. &lt;/p&gt;&lt;p&gt;Unlike &lt;a href=&quot;http://www.elegantcoding.com/2012/03/survey-of-conventional-wisdom-on.html&quot;&gt;others&lt;/a&gt; who advocate specific practices in regards to naming I feel that naming should be dealt with in a flexible framework that can be adapted to a specific project’s needs.  While I personally agree and disagree with ideas previously discussed, my philosophy is that naming should be done consistently and comprehensively reflecting deliberate choices using conceptual understanding and analysis of the Domains. Also it should be tracked in a Lexicon, an idea that I am working on and hope to explore in a later post.  Also as I have said before I feel that tooling could be used to allow better conceptual understanding and navigation and the use of analytics and possibly visualization could be used to ease naming decisions in practice by providing improvements to both &lt;a href=&quot;http://en.wikipedia.org/wiki/Static_program_analysis&quot;&gt;static analysis&lt;/a&gt; and interactive &lt;a href=&quot;http://en.wikipedia.org/wiki/Autocompletion&quot;&gt;autosuggest&lt;/a&gt;/&lt;a href=&quot;http://en.wikipedia.org/wiki/IntelliSense&quot;&gt;intellisense&lt;/a&gt; aids.&lt;/p&gt;&lt;p&gt;I feel that these ideas are an attempt to create a more &quot;formalized&quot; approach to what Eric Evan’s does in &lt;u&gt;Domain Driven Design&lt;/u&gt; which also covers a number of other structural ideas, I hope to extend my ideas here to better integrate some of those as well.  The next steps for me are to undertake an analytic approach I also hope to explore the application of ideas like &lt;a href=&quot;http://en.wikipedia.org/wiki/Formal_concept_analysis&quot;&gt;formal concept analysis&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Spectral_graph_theory&quot;&gt;spectral graph theory&lt;/a&gt; techniques which may add some mathematical rigor to these ideas and perhaps allow some empirical validation and probably refinement. Now it gets really hard so it might be a while for those follow-ups.&lt;/p&gt;&lt;br /&gt;</description><link>http://www.elegantcoding.com/2012/05/software-system-morphology.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJpwA0FvR13lEjkBeNVxRnFaZN_bqn6EaYc5bmUY0D-A3JyO3yhNJHnZP36Pr6CXAGDo2LzsRTFReAcoicLCVR0VwdZU8D5nCWfYtI8IsNI52uDJK6pqa_mLLfhgMi5IzQCxX-eDB-uU4f/s72-c/europa_galileo.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-4856506076120221020</guid><pubDate>Sun, 29 Apr 2012 21:12:00 +0000</pubDate><atom:updated>2014-07-08T13:41:41.328-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Code Reuse</category><category domain="http://www.blogger.com/atom/ns#">Computer Science</category><category domain="http://www.blogger.com/atom/ns#">Design Patterns</category><category domain="http://www.blogger.com/atom/ns#">Generic Programming</category><category domain="http://www.blogger.com/atom/ns#">Math</category><category domain="http://www.blogger.com/atom/ns#">Scala</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><category domain="http://www.blogger.com/atom/ns#">Software Frameworks</category><title>What is Generic Programming?</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZkDf_OXQ6rf9vX-L2-DvCfU_lnqCDhFTy2X8BXfcuZboEsf0ddE3Z9BH3PhuWf-iC6ID2ppkSPVjhVuUbUnIDE5hE44F0ngsuMJaFd1qpGhCQTZQ1_wbLpvuyxKEB25jh3hmVm7nnc7r/s1600/paris.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;300&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZkDf_OXQ6rf9vX-L2-DvCfU_lnqCDhFTy2X8BXfcuZboEsf0ddE3Z9BH3PhuWf-iC6ID2ppkSPVjhVuUbUnIDE5hE44F0ngsuMJaFd1qpGhCQTZQ1_wbLpvuyxKEB25jh3hmVm7nnc7r/s400/paris.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}
&lt;/style&gt;&lt;!--What is Generic Programming?--&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;Over the course of my career I have strived to write reusable code, always looking for more general patterns and trying to refactor code to more flexible more generic versions sometimes with mixed success.  Lately it has become something of an obsession of mine in that I both try to employ it and have been endeavoring to learn more about it, what it really is, and how to do it right, as I have previously pondered I believe there is a &lt;a href=&quot;http://www.elegantcoding.com/2012/02/software-reuse-complexity-curve.html&quot;&gt;complexity cost with increased reuse&lt;/a&gt;.  Over the last few years, which I have been programming in Java, generics has become a central tool in achieving reuse.  So such a concept comes to mind but it is just one idea in a larger framework of ideas on &lt;a href=&quot;http://en.wikipedia.org/wiki/Generic_programming&quot;&gt;generic programming&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;There is a fair amount of research and discussion of the ideas pertaining to generic programming, the title of this post is taken directly from a &lt;a href=&quot;http://lcsd05.cs.tamu.edu/papers/dos_reis_et_al.pdf&quot;&gt;paper on the topic&lt;/a&gt;, which perhaps not so coincidently was presented at the same OOPSLA (2005) as the paper on &lt;a href=&quot;http://lcsd05.cs.tamu.edu/papers/veldhuizen.pdf&quot;&gt;Software Reuse and Entropy&lt;/a&gt; that &lt;a href=&quot;http://www.elegantcoding.com/2011/07/software-frameworks-resistance-isnt.html&quot;&gt;I previously discussed&lt;/a&gt;.  It just seems like every idea I explore is super-interrelated to everything else and this post will be no exception, I can conceptually connect these two papers using a Kevin Bacon like approach using just two other research papers, ideas I have for other posts.  I will try to keep this one as focused as possible.  Also the referenced &lt;a href=&quot;http://lcsd05.cs.tamu.edu/papers/dos_reis_et_al.pdf&quot;&gt;paper&lt;/a&gt; is, like the Software Framework paper, very math heavy but different math, &lt;a href=&quot;http://en.wikipedia.org/wiki/Category_theory&quot;&gt;Category Theory,&lt;a href=&quot;http://en.wikipedia.org/wiki/Order_theory&quot;&gt;Order Theory&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Universal_algebra&quot;&gt;Universal Algebra&lt;/a&gt;, etc. This post will focus on more high level concepts and not the details of math that I wish I could claim that I fully understand.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;So back to our question, what is generic programming?   For me it is about reuse, and while the information entropy approach to understanding reuse was about reuse from perspective of measure and the reuse (measurable) variation on different domains, I feel that the generic programming concept is about the structure of reuse and how it is implemented in various programming paradigms but the concept itself transcends language specific interpretations and implementations.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As you can tell I am not sure how to exactly answer this question so I will defer to the experts.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&quot;&lt;a href=&quot;http://lcsd05.cs.tamu.edu/papers/dos_reis_et_al.pdf&quot;&gt;What is generic programming?&lt;/a&gt;&quot; in part outlines the paradigmatic distinctions between mainstream OO languages (Java Generics, C++ with STL) and Functional languages (Haskel, Scheme):&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;As for most programming paradigms, there are several definitions of generic programming in use. In the simplest view generic programming is equated to a set of language mechanisms for implementing type-safe polymorphic containers, such as List&amp;lt;T&amp;gt; in Java. The notion of generic programming that motivated the design of the Standard Template Library (STL) advocates a broader definition: a programming paradigm for designing and developing reusable and efficient collections of algorithms. The functional programming community uses the term as a synonym for polytypic and type-indexed programming, which involves designing functions that operate on data-types having certain algebraic structures.&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;In &quot;&lt;a href=&quot;http://www.stepanovpapers.com/genprog.pdf&quot;&gt;Generic Programming&lt;/a&gt;&quot; written in 1988 by David A. Musser and &lt;a href=&quot;http://www.stepanovpapers.com/&quot;&gt;Alexander A. Stepanov&lt;/a&gt; use Ada and Scheme and describe generic programming as:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;By generic programming, the definition of algorithms and data structures at an abstract or generic level, thereby accomplishing many related programming tasks simultaneously.  The central notion is that of generic algorithms, which are parameterized procedural schemata that are completely independent of the underlying data representation and are derived from concrete efficient algorithms.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;A discipline that consists of the gradual lifting of concrete algorithms abstracting over details, while retaining the algorithm semantics and efficiency.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;That last sentence has a very Agile/Refactoring feel to it.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Ralf Hinze in &quot;&lt;a href=&quot;http://www.cs.ox.ac.uk/ralf.hinze/publications/habilitation.pdf&quot;&gt;Generic Programs and Proofs&lt;/a&gt;&quot; describes it as: &lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;A generic program is one that the programmer writes once, but which works over many different data types.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;Broadly speaking, generic programming aims at relieving the programmer from repeatedly writing functions of similar functionality for different user-defined data types. A generic function such as a pretty printer or a parser is written once and for all times; its specialization to different instances of data types happens without further effort from the user. This way generic programming greatly simplifies the construction and maintenance of software systems as it automatically adapts functions to changes in the representation of data.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;So, at first sight, generic programming appears to add an extra level of complication and abstraction to programming. However, I claim that generic programming is in many cases actually simpler than conventional programming.  The fundamental reason is that genericity gives you &quot;a lot of things for free&quot; ...&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;This last statement resonates with me as it parallels my thoughts on the desirability of using &lt;a href=&quot;http://www.elegantcoding.com/2011/07/software-frameworks-resistance-isnt.html&quot;&gt;software frameworks&lt;/a&gt; and I feel that I continuously have this conversation (argument) with junior level programmers and also senior level &lt;a href=&quot;http://www.elegantcoding.com/2011/10/confederacy-of-cargo-cult-coders.html&quot;&gt;cargo cult coders&lt;/a&gt; who don’t get it.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Design Patterns are a common generic concept in mainstream programming.  It turns out that a number of design patterns can be described in the framework laid out by these papers and a number of papers do exactly that including &quot;&lt;a href=&quot;http://www.cs.ox.ac.uk/jeremy.gibbons/publications/hodgp.pdf&quot;&gt;Design Patterns as Higher-Order Datatype-Generic Programs &lt;/a&gt;&quot; part of extensive research on the topic by Jeremy Gibbons:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Design patterns, as the subtitle of the seminal book has it, are ‘elements of reusable object-oriented software’. However, within the confines of existing mainstream programming languages, these supposedly reusable elements can only be expressed extra-linguistically: as prose, pictures, and prototypes. We believe that this is not inherent in the patterns themselves, but  evidence of a lack of expressivity in the languages of today. We expect that, in the languages of the future, the code parts of design patterns will be expressible as directly-reusable library components. The benefits will be considerable: patterns may then be reasoned about, typechecked, applied and reused, just as any other abstractions can. Indeed, we claim that the languages of tomorrow will suffice; the future is not far away. All that is needed, in addition to what is provided by essentially every programming language, are higher-order (parametrization by code) and datatype-generic (parametrization by type constructor) features. Higher-order constructs have been available for decades in functional programming languages such as &lt;a href=&quot;http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;amp;tid=3874&quot;&gt;ML&lt;/a&gt; and &lt;a href=&quot;http://www.haskell.org/definition/haskell98-report.pdf&quot;&gt;Haskell&lt;/a&gt;. Datatype genericity can be simulated in &lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.19.7113&quot;&gt;existing programming languages&lt;/a&gt; &lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.463&quot;&gt;[2]&lt;/a&gt;, but we already have significant experience with robust prototypes of languages that support &lt;a href=&quot;http://igitur-archive.library.uu.nl/math/2007-0404-200301/jeuring_03_generichaskellpractice_technical.pdf&quot;&gt;it natively&lt;/a&gt; &lt;a href=&quot;http://www.andres-loeh.de/ExploringGH.pdf&quot;&gt;[2]&lt;/a&gt;. We argue our case by capturing as higher-order datatypegeneric programs a small subset &lt;a href=&quot;http://www.cs.ox.ac.uk/jeremy.gibbons/publications/origami.pdf&quot;&gt;ORIGAMI&lt;/a&gt; of the &lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.71.463&quot;&gt;Gang of Four (GOF) patterns&lt;/a&gt;. (For the sake of rhetorical style, we equate ‘GOF patterns’ with ‘design patterns’.) These programs are parametrized along three dimensions: by the shape of the computation, which is determined by the shape of the underlying data, and represented by a type constructor (an operation on types); by the element type (a type); and by the body of the computation, which is a higher-order argument (a value, typically a function).  Although our presentation is in a functional programming style, we do not intend to argue that functional programming is the paradigm of the future (whatever we might feel personally!).  Rather, we believe that functional programming languages are a suitable test-bed for experimental language features - as evidenced by parametric polymorphism and list comprehensions, for example, which are both now finding their way into mainstream programming languages such as Java and C#.  We expect that the evolution of programming languages will continue to follow the same trend: experimental language features will be developed and explored in small, nimble laboratory languages, and the successful experiments will eventually make their way into the outside world. Specifically, we expect that the mainstream languages of tomorrow will be broadly similar to the languages of today — strongly and statically typed, object-oriented, with an underlying imperative mindset — but incorporating additional features from the functional world — specifically, higher-order operators and datatype genericity&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;Lately I have been making more of an effort to learn Scala. Bruno Oliveira and Jeremy Gibbons make the case in &quot;&lt;a href=&quot;www.cs.ox.ac.uk/jeremy.gibbons/publications/scalagp.pdf&quot;&gt;Scala for Generic Programmers&lt;/a&gt;&quot; that it might be one of or even the best language for expressing Generic Programming concepts in part due to its hybridization of object oriented and functional paradigms. Here is the abstract in its entirety:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Datatype-generic programming involves parametrization by the shape of data, in the form of type constructors such as ‘list of’.  Most approaches to datatype-generic programming are developed in the lazy functional programming language Haskell. We argue that the functional object-oriented language Scala is in many ways a better setting. Not only does Scala provide equivalents of all the necessary functional programming features (such parametric polymorphism, higher-order functions, higher-kinded type operations, and type- and constructor-classes), but it also provides the most useful features of object-oriented languages (such as subtyping, overriding, traditional single inheritance, and multiple inheritance in the form of traits). We show how this combination of features benefits datatype-generic programming, using three different approaches as illustrations.&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;So far for me Scala has been a joy.  Its features and flexibility are beautifully elegant of course I am tainted coming from the clumsy, clinking, clanking, clattering caliginous world of Java, BTW Java we need to talk, it’s not you, it’s me. I’ve met someone else.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Jeremy Gibbons Makes the following point in &quot;&lt;a href=&quot;http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.159.1228&quot;&gt;Datatype-Generic Programming&lt;/a&gt;&quot;:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Generic programming is about making programming languages more flexible without compromising safety. Both sides of this equation are important, and becoming more so as we seek to do more and more with computer systems, while becoming ever more dependent on their reliability.&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;This idea is similar to ideas that &lt;a href=&quot;http://www.infoq.com/author/Gerald-Jay-Sussman&quot;&gt;Gerald Sussman&lt;/a&gt; explores in his talk at &lt;a href=&quot;https://thestrangeloop.com/&quot;&gt;Strangeloop&lt;/a&gt; 2011 &quot;&lt;a href=&quot;http://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Compute&quot;&gt;We Really Don’t Know How To Compute&lt;/a&gt;&quot;.  However, his general and perhaps philosophical approach to the idea of generic programming is very different from the previous ideas:    &lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;[8:40]We spend all of our time modifying existing code, the problem is our code is not adequately evolvable it is not adequately modifiable to fit the future in fact what we want is to make systems that have the property that they are good for things that the designer didn’t even think of or intend.  ... That’s the real problem. ...  The problem is that when we build systems whatever they are we program ourselves into holes. ...  It means that we make decisions early in some process that spread all over our system the consequences of those decisions such that the things that we want to change later are very difficult to change because we have to change a very large amount of stuff.  ... I want to figure ways that we can organize systems so that the consequence of the decisions we make are not expensive to change, we can’t avoid making decisions but we can try to figure out ways to minimize the cost of changing decisions we have made.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;[11:40]Dynamically extensible generic operations  ...  I want to dynamically extend things while my program is running  ... I want a program to compute up what it is going to do.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;He shows an example[19:00] which is &quot;the definition of the method of computing Lagrange Equations from a Lagrangian given a configuration space path&quot;. This is apparently easy stuff, to him at least.  Fortunately you don’t really need to understand the details of this math to understand his points here:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;[20:45]This is a little tiny feeling of what is it needed to make things more flexible consider the value here, the value is that I am dynamically allowed to change the meaning of all my operators to add new things that they can do. Dynamically. Not at compile time, at runtime.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;[21:15]It gives me tremendous flexibility. Flexibility because the program I wrote to run on  a bunch of numbers with only a little bit of tweaking suddenly runs on matrices so long as I didn’t make mistake of commuting something wrong. ... So this makes proving the theorems very hard In fact maybe impossible the cost and the benefits are very extreme. I can pay  correctness or proofs of correctness or belief in correctness, I can pay that for tremendous flexibility. ... Is correctness the essential thing I want, I am not opposed to proofs, I love proofs I am an old mathematician. The problem is that putting us into the situation that &lt;a href=&quot;http://en.wikipedia.org/wiki/Edsger_W._Dijkstra&quot;&gt;Mr. Dijkstra&lt;/a&gt; got us into ... where you are supposed to prove everything to be right before you write the program getting into that situation puts us in a world where we have to make the specifications for the parts as tight as possible because it’s hard to prove general things, except occasionally it’s easier but it’s usually harder to prove a general theorem about something so you make a very specialized thing that works for a particular case you build this very big tower of stuff and boy is that brittle change the problem a little and it all falls over.&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;His ideas tend towards adaptable and self modifying code at one point he talks about self modifying code in both assembly language and the use of eval in Lisp.  He also touches on a number of parallels in the biological world including genetics and the adaptability of the human immune system to fight off mutating parasites.  Interestingly some of his ideas seem similar to work done by &lt;a href=&quot;http://www.cs.unm.edu/~forrest/&quot;&gt;Stephanie Forrest&lt;/a&gt; on using evolutionary/genetic algorithms for program repair which she speaks about at the &lt;a href=&quot;http://www.infoq.com/presentations/The-Case-for-Evolvable-Software&quot;&gt;keynote&lt;/a&gt; of SPLASH 2010, formerly known as OOPSLA.  The genetic repair approach at the conceptual level is striving for the same results as what &lt;a href=&quot;http://www.infoq.com/author/Gerald-Jay-Sussman&quot;&gt;Gerald Sussman&lt;/a&gt; describes.  Also did you notice that the &lt;a href=&quot;http://en.wikipedia.org/wiki/Levenshtein_distance&quot;&gt;Levenshtein Distance&lt;/a&gt; between &quot;generic programming&quot; and &quot;genetic programming&quot; is (one substitution), pretty weird!&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Seriously though, the objectives of all of these approaches are the same: building better more flexible software that handles more situations. These ideas are reflected in how &lt;a href=&quot;http://www.elegantcoding.com/2012/01/real-software-engineering-good-bad-and.html&quot;&gt;Glenn Vanderburg describes software engineering&lt;/a&gt;:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;Software engineering is the science and art of designing and making, with economy and elegance, systems so that they can readily adapt to situations which they may be subjected.&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;I feel this Software Engineering insight reinforces &lt;a href=&quot;http://www.elegantcoding.com/2012/01/real-software-engineering-good-bad-and.html&quot;&gt;my opinion&lt;/a&gt; that we will eventually see a real math backed discipline of software engineering and I think that the research work discussed  here both supports my conjecture on this point and most likely lays part of that foundation.  I also think some of these ideas reflect ideas I discussed in &quot;&lt;a href=&quot;http://www.elegantcoding.com/2012/02/software-reuse-complexity-curve.html&quot;&gt;The Software Reuse Complexity Curve&lt;/a&gt;&quot; which implies that programmers will need to become more aware and more adept at more advanced theoretically based concepts like for example &lt;a href=&quot;http://www.haskell.org/haskellwiki/GADT&quot;&gt;GADT’s (Generalized algebraic datatypes)&lt;/a&gt;, etc. and of course math in general such as &lt;a href=&quot;http://www.elegantcoding.com/2012/03/interesting-group.html&quot;&gt;Abstract Algebra&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Clearly the idea of Generic programming has some very specific ideas and some very general objectives. There seem to be two approaches here which might described Predictive vs. Adaptive, much like the idea of &lt;a href=&quot;http://martinfowler.com/articles/newMethodology.html#PredictiveVersusAdaptive&quot;&gt;Separation of Design and Construction&lt;/a&gt; described by Martin Fowler.  The Gibbons et al more calculational approach is &lt;b&gt;predictive&lt;/b&gt; whereas the Sussman/Forrest ideas describe an &lt;b&gt;adaptive&lt;/b&gt; approach. I suspect that this will just be another dimension of program design that will have to be considered and assessed as a tradeoff in its application, which Sussman also mentions.&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/04/what-is-generic-programming.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxZkDf_OXQ6rf9vX-L2-DvCfU_lnqCDhFTy2X8BXfcuZboEsf0ddE3Z9BH3PhuWf-iC6ID2ppkSPVjhVuUbUnIDE5hE44F0ngsuMJaFd1qpGhCQTZQ1_wbLpvuyxKEB25jh3hmVm7nnc7r/s72-c/paris.jpg" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-658407234782678688</guid><pubDate>Sun, 01 Apr 2012 20:47:00 +0000</pubDate><atom:updated>2012-05-06T11:59:56.721-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Neuroscience</category><category domain="http://www.blogger.com/atom/ns#">Pair Programming</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><title>The Coding Buzz</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiILuRYn5ZAUh9zZdsoU6LDvVzPSHzj2RVdoX2CI1kieOoC95tBXQGsM14ycxwk7Qlt2Gx9hQVd5sRO8-wbdNy0bMGK6UmjHAOCD4X0bBlI9UOpqjGgBMN-nTbScn9SHb-p6fHNdFxrqEYy/s1600/533207main_iss027e006501_full.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;274&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiILuRYn5ZAUh9zZdsoU6LDvVzPSHzj2RVdoX2CI1kieOoC95tBXQGsM14ycxwk7Qlt2Gx9hQVd5sRO8-wbdNy0bMGK6UmjHAOCD4X0bBlI9UOpqjGgBMN-nTbScn9SHb-p6fHNdFxrqEYy/s400/533207main_iss027e006501_full.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}
&lt;/style&gt;&lt;!--The Coding Buzz--&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;In the episode of Seinfeld titled &quot;The Frogger&quot; Jerry and George discover a long lost Frogger machine that still has the G.L.C. George Louis Costanza high score of 860,000 of which George reminisces: &quot;I remember that night. The perfect combination of Mountain Dew and mozzarella...just the right amount of grease on the joy stick...&quot;&lt;/p&gt;&lt;p&gt;This essentially sums up what I call the coding buzz, for me it&#39;s the perfect combination of a good problem, private time to work on it, and just the right combination of caffeine and music.  The coding buzz is what I live for, those narcotic moments of creative bliss when all other distractions and even personal problems melt away into the background and your mind and fingers become one with your editor begetting a symphony of code creation.  It&#39;s a wonderful thing.&lt;/p&gt;&lt;p&gt;To really achieve the coding buzz one needs to have a level proficiency generally denoted with the quantity 10,000 hours, meaning that you need at least 10,000 hours of practice.  It turns out that the coding buzz is what is called &quot;flow&quot;.  This is from &lt;a href=&quot;http://www.newscientist.com/article/mg21328501.600-zap-your-brain-into-the-zone-fast-track-to-pure-focus.html&quot;&gt;an article on New Scientist&lt;/a&gt;:&lt;/p&gt;&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;The first is an intense and focused absorption that makes you lose all sense of time. The second is what is known as autotelicity, the sense that the activity you are engaged in is rewarding for its own sake. The third is finding the &quot;sweet spot&quot;, a feeling that your skills are perfectly matched to the task at hand, leaving you neither frustrated nor bored. And finally, flow is characterised by automaticity, the sense that &quot;the piano is playing itself&quot;, for example.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;Flow typically accompanies these actions. It involves a Zen-like feeling of intense concentration, with time seeming to stop as you focus completely on the activity in hand. The experience crops up repeatedly when experts describe what it feels like to be at the top of their game, and with years of practice it becomes second nature to enter that state.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;Exactly what happens in the brain during flow has been of particular interest, but it has been tricky to measure. Csikszentmihalyi took an early stab at it, using electroencephalography (EEG) to measure the brain waves of expert chess players during a game. He found that the most skilled players showed less activity in the prefrontal cortex, which is typically associated with higher cognitive processes such as working memory and verbalisation. That may seem counter-intuitive, but silencing self-critical thoughts might allow more automatic processes to take hold, which would in turn produce that effortless feeling of flow.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This is why after over two decades I still mostly like to work as a developer, admittedly not all of my career has consisted of  those moments, but the times I found myself immersed in those types of projects both personal and professional has well been worth it.  I frequently feel that I should have grown up at some point and tried to pursue the management track or a more formal architect position and I have contemporary colleagues that are VPs and CTOs, etc.  However, every time I think  about such a career path I realize how much I would dislike it and I would then have to let go of being hands on, I know there are probably cases of those types of positions where that is not the case, but you would have to find the right environment.&lt;/p&gt;&lt;p&gt;I have recently found myself in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Pair_programming&quot;&gt;pair programming&lt;/a&gt; environment and while there are some aspects of it that are ok, but I often find myself sneaking away to do the creative experimental work on my own.  As an introvert I sometimes find it hard to pair.  One problem is that there is a substantial skill differential between my teammates and me in that I am considerably more senior so that&#39;s a problem, thus I am not sure if my issues with pairing are truly accurate. Still when I need to build some complex functionality or refactor code that requires you to hold dozens of classes in your head, tasks that require intense concentration and that both require you to and reward you for being in the zone aka achieve flow, I just have trouble seeing doing this effectively with the added pressure of someone looking over your shoulder.  I have spoken with developers who like pairing and perhaps it&#39;s an introvert/extrovert preference.&lt;/p&gt;&lt;p&gt;When I originally came up with the idea for this post I just wanted to talk about the euphoric bliss of the coding buzz but now I find myself in a situation that seems to be harshing that coding buzz, to put it in the parlance of our times.  Coincidently I am writing this at time when the &quot;group&quot; approach seems to be coming under fire, most notably in an article in the New York Times entitled &quot;&lt;a href=&quot;http://www.nytimes.com/2012/01/15/opinion/sunday/the-rise-of-the-new-groupthink.html&quot;&gt;The Rise of the New Groupthink&quot;&lt;/a&gt; by Susan Cain which includes the following:&lt;/p&gt;&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;The reasons brainstorming fails are instructive for other forms of group work, too. People in groups tend to sit back and let others do the work; they instinctively mimic others&#39; opinions and lose sight of their own; and, often succumb to peer pressure. The Emory University neuroscientist Gregory Berns found that when we take a stance different from the group&#39;s, we activate the amygdala, a small organ in the brain associated with the fear of rejection. Professor Berns calls this &quot;the pain of independence.&quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;She also includes the following excellent quote from Steve Wozniak:&lt;/p&gt;&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;Most inventors and engineers I&#39;ve met are like me ... they live in their heads. They&#39;re almost like artists. In fact, the very best of them are artists. And artists work best alone .... I&#39;m going to give you some advice that might be hard to take. That advice is: Work alone... Not on a committee. Not on a team.&lt;br /&gt;
&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;She also has an interesting &lt;a href=&quot;http://www.ted.com/talks/lang/en/susan_cain_the_power_of_introverts.html&quot;&gt;TED talk&lt;/a&gt;.  As an introvert I feel that both Woz&#39;s and her sentiments resonate with me, and I really know what it&#39;s like to live in my head, I can&#39;t imagine doing good creative work any other way.&lt;/p&gt;&lt;p&gt;As I said the groupthink backlash and pair programming skepticism seems to be something of a hot topic at the moment, see this &lt;a href=&quot;http://www.infoq.com/news/2012/03/agile_stifiling_introverts&quot;&gt;compendium post on InfoQ&lt;/a&gt; which includes some these and other links.  Obviously communication is essential in a multi-person software project but is pair programming over doing it?  It just feels like a coding buzz kill to me.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;p&gt;&amp;nbsp;&lt;p&gt;&lt;p&gt;The following two talks are some additional interesting and relevant neuroscience related resources:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=uPBapVkZJww&amp;feature=plcp&amp;context=C46fc796VDvjVQa1PpcFOKi--7u6RbCU1wl02kytFbc7KYeMQhDEE%3D&quot;&gt;Authors@Google: Sandra Aamodt &amp; Sam Wang&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=XeJSXfXep4M&quot;&gt;Your Brain at Work by David Rock.&lt;/a&gt;&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/04/coding-buzz.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiILuRYn5ZAUh9zZdsoU6LDvVzPSHzj2RVdoX2CI1kieOoC95tBXQGsM14ycxwk7Qlt2Gx9hQVd5sRO8-wbdNy0bMGK6UmjHAOCD4X0bBlI9UOpqjGgBMN-nTbScn9SHb-p6fHNdFxrqEYy/s72-c/533207main_iss027e006501_full.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-8525151354191190000</guid><pubDate>Thu, 29 Mar 2012 01:49:00 +0000</pubDate><atom:updated>2012-05-28T21:12:18.474-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Abstract Algebra</category><category domain="http://www.blogger.com/atom/ns#">Complex numbers</category><category domain="http://www.blogger.com/atom/ns#">Group Theory</category><category domain="http://www.blogger.com/atom/ns#">Math</category><title>Amazing Abstract Algebra: Groups and Rotations</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizdyzAtd6c3SEbraqTKIJP4iMbnSRi7dijCozv2lLb5dE0Zvaka9rLxwc10tMBQiIVAW3-AntYh9tjPb6s2GypMmKi41XYd3_wAEJKb-y3jlfscolVAnEJS0It1KieFkdkcpDmb0e5dMJR/s1600/IMG_7160.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;300&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizdyzAtd6c3SEbraqTKIJP4iMbnSRi7dijCozv2lLb5dE0Zvaka9rLxwc10tMBQiIVAW3-AntYh9tjPb6s2GypMmKi41XYd3_wAEJKb-y3jlfscolVAnEJS0It1KieFkdkcpDmb0e5dMJR/s400/IMG_7160.JPG&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
    td.z0 {
        padding:15px;
        font-size: 16px;
        text-align : center;
        background-color: #ffffff;
        color:black;
        border : 1px solid black;
    }

    td.z1 {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #ffff00;
        color:black;
        border : 1px solid black;
    }

    td.z2 {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #66ff33;
        color:black;
        border : 1px solid black;
    }

    td.z3 {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #669933;
        color:black;
        border : 1px solid black;
    }

    td.v {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #00ffff;
        color:black;
        border : 1px solid black;
    }

    td.h {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #ff66cc;
        color:black;
        border : 1px solid black;
    }

    td.d1 {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #9966ff;
        color:black;
        border : 1px solid black;
    }

    td.d2 {
        padding:15px;
        font-size: 16px;
        text-align : center;
        vertical-align : center;
        background-color: #0000ff;
        color:black;
        border : 1px solid black;
    }

    div.source-code {
        color             : #000;
        background-color  : #eee;
        border            : 1px dashed #999999;
        line-height       : 14px;
        padding           : 5px;
        overflow          : auto;
        width             : 100%;
        text-indent       : 0px;
        margin-top        : 8px;
        margin-bottom     : 8px;
    }
&lt;/style&gt;&lt;br /&gt;
&lt;p&gt;A little while ago I noticed a very interesting group, I am sure it is well known in math circles but I find it intriguing for a number of reasons and I have recently learned more about &lt;a href=&quot;http://en.wikipedia.org/wiki/Abstract_algebra&quot;&gt;Abstract Algebra&lt;/a&gt; which ties in some more interesting ideas.  The group relates to &lt;a href=&quot;http://en.wikipedia.org/wiki/Imaginary_number&quot;&gt;imaginary numbers&lt;/a&gt;, it is the set {1,-1,i,-i} which is closed under multiplication.  It has an identity which is 1.  Each element has an inverse, -1 is its own inverse: -1 &amp;middot; -1 = 1 and -i &amp;middot; i  = 1.  The following &lt;a href=&quot;http://en.wikipedia.org/wiki/Cayley_table&quot;&gt;cayley table&lt;/a&gt; shows all this:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;  style=&quot;text-align:center;&quot;&gt;&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;&amp;bull;&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;-i&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;If you are new to these ideas I recommend looking at my &lt;a href=&quot;http://www.elegantcoding.com/2012/01/abstract-algebra-logic-of-odd-and-even.html&quot;&gt;previous post&lt;/a&gt; on abstract algebra, especially since we will be looking at some &lt;a href=&quot;http://en.wikipedia.org/wiki/Isomorphism&quot;&gt;isomorphisms&lt;/a&gt; again.  In order to talk about the ideas in the post we need to get some group theory concepts out of the way first, don&#39;t worry they aren&#39;t hard in fact they&#39;re fairly intuitive.  Also in this post I am restricting the discussion to finite groups, groups with a finite number of elements.  In fact the first idea is the concept of group order.&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;The order of a finite group is simply the number of elements of the set the group is defined on and is denoted as |G|.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;The group above has an order of 4.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The next idea is that of exponentiation, which can be thought of as a subset of &quot;classical&quot; exponentiation on the field of real numbers, see identities &lt;a href=&quot;http://www.elegantcoding.com/2011/10/ologn.html&quot;&gt;here&lt;/a&gt;.  Exponentiation on group elements extends to integer exponents only and refers to repeated application of the binary operation to the element itself. So:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;a&lt;sup&gt;n&lt;/sup&gt; = a&amp;middot;a&amp;middot;a&amp;middot;a...a ( a &quot;times&quot; itself n times)&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;a&lt;sup&gt;-n&lt;/sup&gt; = a&lt;sup&gt;-1&lt;/sup&gt;&amp;middot;a&lt;sup&gt;-1&lt;/sup&gt;&amp;middot;a&lt;sup&gt;-1&lt;/sup&gt;&amp;middot;a&lt;sup&gt;-1&lt;/sup&gt;...a&lt;sup&gt;-1&lt;/sup&gt;  (a&lt;sup&gt;-1&lt;/sup&gt; &quot;times&quot; itself n times or the inverse of a&lt;sup&gt;n&lt;/sup&gt;)&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;a&lt;sup&gt;0&lt;/sup&gt; = e (where e is the identity element)&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;The laws of exponents are:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;a&lt;sup&gt;m&lt;/sup&gt; a&lt;sup&gt;n&lt;/sup&gt; = a&lt;sup&gt;m+n&lt;/sup&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;(a&lt;sup&gt;m&lt;/sup&gt;)&lt;sup&gt;n&lt;/sup&gt; = a&lt;sup&gt;mn&lt;/sup&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;a&lt;sup&gt;-n&lt;/sup&gt; = (a&lt;sup&gt;-1&lt;/sup&gt;)&lt;sup&gt;n&lt;/sup&gt; = (a&lt;sup&gt;n&lt;/sup&gt;)&lt;sup&gt;-1&lt;/sup&gt;&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Just as a group has an order an element of a group also has an order and it is related to exponentiation and it is defined as:&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;If there exists a nonzero integer m such that a&lt;sup&gt;m&lt;/sup&gt;=e, then the order of the element is defined to be the least positive integer n such that a&lt;sup&gt;n&lt;/sup&gt;=e.  Also if there does not exist any nonzero integer m such that a&lt;sup&gt;m&lt;/sup&gt;=e, we say that a has order infinity.&lt;br /&gt;
&lt;/p&gt;&lt;/div&gt;&lt;p&gt;So the elements in our group (&amp;sdot;, {1,-1,i,-i}) above have the following orders:&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;1&lt;sup&gt;1&lt;/sup&gt; = 1 (this is the identity and has order 1) [1&lt;sup&gt;1&lt;/sup&gt; = 1, ...]&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;-1&lt;sup&gt;2&lt;/sup&gt; = 1 (has order 2)  [-1&lt;sup&gt;1&lt;/sup&gt; = -1, -1&lt;sup&gt;2&lt;/sup&gt; = 1, ...]&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;i&lt;sup&gt;4&lt;/sup&gt; = 1 (has order 4) [i&lt;sup&gt;1&lt;/sup&gt; = i, i&lt;sup&gt;2&lt;/sup&gt; = -1, i&lt;sup&gt;3&lt;/sup&gt; = -i, i&lt;sup&gt;4&lt;/sup&gt; = 1, ...]&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;-i&lt;sup&gt;4&lt;/sup&gt; = 1 (has order 4) [-i&lt;sup&gt;1&lt;/sup&gt; = -i, -i&lt;sup&gt;2&lt;/sup&gt; = -1, -i&lt;sup&gt;3&lt;/sup&gt; = i, -i&lt;sup&gt;4&lt;/sup&gt; = 1, ...]&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Order is also sometimes referred to as period and you should note that each of the above will cycle through each power listed in the square brackets so for both the order 4 elements {i, -i}:  a&lt;sup&gt;1n&lt;/sup&gt;=a&lt;sup&gt;1&lt;/sup&gt;, a&lt;sup&gt;2n&lt;/sup&gt;=a&lt;sup&gt;2&lt;/sup&gt;, a&lt;sup&gt;3n&lt;/sup&gt;=a&lt;sup&gt;3&lt;/sup&gt;, a&lt;sup&gt;4n&lt;/sup&gt;=a&lt;sup&gt;4&lt;/sup&gt; for all integers n&amp;gt;0 and the values will cycle through the list which would be the case for any element of finite order.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;As it turns out elements like i and -i which cycle through all of the elements of a group exactly once in the period have an order that is equal to the order of the group. These define what is known as a cyclic group. So our group is cyclic and any element which cycles through all elements once is the generator so i and -i are generators for the group.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Another interesting result from group theory is that &lt;b&gt;any cyclic group of order n is isomorphic to the group (+,Z&lt;sub&gt;n&lt;/sub&gt;)&lt;/b&gt; which is the integers (mod n) under addition so our group above is just a renaming of Z&lt;sub&gt;4&lt;/sub&gt; see the similarity to the cayley table below:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;  style=&quot;text-align:center;&quot;&gt;&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;+&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;0&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;2&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;3&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;0&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;0&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt;1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;2&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;3&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;1&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt;1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;2&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;3&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;0&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;2&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;2&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;3&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;0&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt;1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;3&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;3&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;0&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt;1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;2&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;Now I want to take a look at another important group, it&#39;s called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Dihedral_group&quot;&gt;dihedral group&lt;/a&gt;, this one is known as D&lt;sub&gt;4&lt;/sub&gt; and has the cayley table:&lt;br /&gt;
&lt;/p&gt;&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;  style=&quot;text-align:center;&quot;&gt;&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;&amp;nbsp;&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;1&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;2&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;3&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td class=&quot;z0&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;d2&quot;&gt;D&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;h&quot;&gt;H&lt;/td&gt;
    &lt;td class=&quot;d1&quot;&gt;D&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;v&quot;&gt;V&lt;/td&gt;
    &lt;td class=&quot;z3&quot;&gt;R&lt;sub&gt;3&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z1&quot;&gt;R&lt;sub&gt;1&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z2&quot;&gt;R&lt;sub&gt;2&lt;/sub&gt;&lt;/td&gt;
    &lt;td class=&quot;z0&quot;&gt;R&lt;sub&gt;0&lt;/sub&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;The dihedral group is the group of symmetries of a regular polygon, including both rotations and reflections.  In this case we will consider the rotations and reflections of a square denoted as D&lt;sub&gt;4&lt;/sub&gt; represented visually as four couterclockwise rotations of a square:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTB0EoYfwK1yG7ufORRGBpS4nPQlqN7mQfyjjFPv1LyBz-aQ-M119OfzXGpHeboZUst9HD7hQ5AQthaJACit9U_BHyq1l295XK_i23Uu_em0bDkyWBs0r5sJxF7ls_FJ_M6ND1GIgREcXz/s1600/dihedral.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;376&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTB0EoYfwK1yG7ufORRGBpS4nPQlqN7mQfyjjFPv1LyBz-aQ-M119OfzXGpHeboZUst9HD7hQ5AQthaJACit9U_BHyq1l295XK_i23Uu_em0bDkyWBs0r5sJxF7ls_FJ_M6ND1GIgREcXz/s400/dihedral.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;And the following four reflections, vertical, horizontal, and two diagonal reflections:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvF8h4CEYw1pre7YveXKrDbYJI92ZjiWr5-Kxam1ZxTo7b8CBzxgL0wlg-GUhKDKNaqOHhvDtQjBhbAeF-KXMJL48TtB9pCiSq9k1GlyI_rb3cQkGkHwyssHzata4LBH1U0UXKeRsV775b/s1600/dihedral2.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;376&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvF8h4CEYw1pre7YveXKrDbYJI92ZjiWr5-Kxam1ZxTo7b8CBzxgL0wlg-GUhKDKNaqOHhvDtQjBhbAeF-KXMJL48TtB9pCiSq9k1GlyI_rb3cQkGkHwyssHzata4LBH1U0UXKeRsV775b/s400/dihedral2.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;With each image is included the permutation, actually dihedral groups are permutation groups and D&lt;sub&gt;4&lt;/sub&gt; is a set of 8 permutations, hence the order of the group is 8. It is a subgroup of the group of all &lt;a href=&quot;http://www.elegantcoding.com/2011/05/combinatorial-and-other-math-of-java.html&quot;&gt;permutations&lt;/a&gt; of four items which is known as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Symmetric_group&quot;&gt;Symmetric Group&lt;/a&gt; which has order 4!=24, it&#39;s denoted as S&lt;sub&gt;4&lt;/sub&gt;.  The interesting thing here is the rotations form a subgroup that is isomorphic to our group from above and Z&lt;sub&gt;4&lt;/sub&gt;.  In a sense this isn&#39;t really surprising since it is a cyclic group of order four meaning it cycles through 4 items just as a square cycles through four rotations.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As you can see from the color coding, the elements {R&lt;sub&gt;0&lt;/sub&gt;, R&lt;sub&gt;1&lt;/sub&gt;, R&lt;sub&gt;2&lt;/sub&gt;, R&lt;sub&gt;3&lt;/sub&gt;} form a subgroup, a subgroup is just a subset of the elements that is still a group.  These subgroup elements forming the upper left hand corer of the table are color coded to show the isomorphism between this subgroup and Z&lt;sub&gt;4&lt;/sub&gt; and also our group (&amp;sdot;, {1,-1,i,-i}). Also R&lt;sub&gt;0&lt;/sub&gt;  is the identity which makes sense since it is a zero rotation, which means that you didn&#39;t rotate it, or you did by 360&amp;deg; aka one &lt;a href=&quot;http://tauday.com/&quot;&gt;tau&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Our Z&lt;sub&gt;4&lt;/sub&gt; isomorphic group (&amp;sdot;, {1,-1,i,-i}) also has a subgroup. Our original arrangement of the cayley table was ordered to show the Z&lt;sub&gt;4&lt;/sub&gt; isomorphism. To show our subgroup we need to rearrange the cayley table:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;  style=&quot;text-align:center;&quot;&gt;&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;&amp;bull;&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;-i&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z3&quot;&gt;-i&lt;/td&gt;     &lt;td class=&quot;z1&quot;&gt; i&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;Now it should be fairly easy to the subgroup (&amp;sdot;, {1,-1}) again forming the upper left corner in the table above, or shown by itself:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;  style=&quot;text-align:center;&quot;&gt;&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;&amp;bull;&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt;-1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt; &lt;/tr&gt;
&lt;tr&gt;     &lt;td class=&quot;z0&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z2&quot;&gt;-1&lt;/td&gt;     &lt;td class=&quot;z0&quot;&gt; 1&lt;/td&gt; &lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
&lt;p&gt;Now if you think about it our subgroup which is just another group is a group, 1 is the identity and -1 is its own inverse, actually it turns out that &lt;b&gt;all subgroups of cyclic groups are also cyclic groups&lt;/b&gt; and since all cyclic groups are isomorphic to Z&lt;sub&gt;n&lt;/sub&gt; groups, this group is actually one that we have &lt;a href=&quot;http://www.elegantcoding.com/2012/01/abstract-algebra-logic-of-odd-and-even.html&quot;&gt;seen before&lt;/a&gt; it&#39;s just Z&lt;sub&gt;2&lt;/sub&gt; addition aka exclusive-or, etc.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Also there are some remarkable connections to number theory in regards to the order of subgroups and the order of elements, for example the order of our subgroup is 2 which evenly divides 4 the order of the group, &lt;b&gt;the order of a subgroup will always evenly divide the order of the group&lt;/b&gt;. Also &lt;b&gt;the order of each element evenly divides the order of the group&lt;/b&gt;.  I suspect that these ideas have profound implications.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Going back to our original group there are a couple of interesting things about imaginary numbers, first are the following equations:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2kHdbJ1U6CLxDEm3PHkPJBL-JTsAfiAAQ27KE7y9PMdMrBdE3mj1m9Zq3MAWXgJwLQWkCfj8FX4Nmpq1oqGJtOhr4w0MiEJFs7yZ790U1XK0Rv-2Rl5CLB-eTGE1-St5n0jRYOvBjY00g/s1600/i-inverse.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;16&quot; width=&quot;64&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2kHdbJ1U6CLxDEm3PHkPJBL-JTsAfiAAQ27KE7y9PMdMrBdE3mj1m9Zq3MAWXgJwLQWkCfj8FX4Nmpq1oqGJtOhr4w0MiEJFs7yZ790U1XK0Rv-2Rl5CLB-eTGE1-St5n0jRYOvBjY00g/s400/i-inverse.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMBYGeL1EFY2DL4bLBfyIAhOjVRSrbrQcZ9fXz9MLSmcdm7PBFRSABBDMJ434RgbGwFdfq0WABY6NNOGzK6rdiMPBYuDfmlib239ze1DavFceq5H6va3NmIFZdnhw3XfidIXC4xo_7bhRN/s1600/i-div-i.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;35&quot; width=&quot;37&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMBYGeL1EFY2DL4bLBfyIAhOjVRSrbrQcZ9fXz9MLSmcdm7PBFRSABBDMJ434RgbGwFdfq0WABY6NNOGzK6rdiMPBYuDfmlib239ze1DavFceq5H6va3NmIFZdnhw3XfidIXC4xo_7bhRN/s400/i-div-i.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;If we consider the sequence of raising i to successive powers, multiplying by I each time, if we start with 1, we get the sequence (1, i, -1, -i), these are actually coordinates in the complex plane and can be written as (0i+1, 1i+0, 0i-1, -1i+0). This cycle (increasing powers of i) is the following (counter clockwise) rotation in the complex plane:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzFozb78ysCuD6QgCSHDcALWBgpnI_7Ln9yEsHmlwW1o2LkbTIxcu9TWarXpxXfIUWeA65DzJuiTBhdSRWVJ-G3RW1I_b-WNEDXl-xQqPPKZzzp582Bkuuf3bDOfVlkIRHEgMzQ8-QfdJq/s1600/complex-plane%252B1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzFozb78ysCuD6QgCSHDcALWBgpnI_7Ln9yEsHmlwW1o2LkbTIxcu9TWarXpxXfIUWeA65DzJuiTBhdSRWVJ-G3RW1I_b-WNEDXl-xQqPPKZzzp582Bkuuf3bDOfVlkIRHEgMzQ8-QfdJq/s400/complex-plane%252B1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Conversely if we divide, or repeatedly multiply by  -i, we get the following sequence (1,-i,-1,i) which correspond to the complex numbers (0i+1, -1i+0, 0i-1, 1i+0) and is the opposite (clockwise) rotation:&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi73uKbx8ZvJkNqM_TOhc6ASxPPhMW2-ca-iHv9Nnm6PZRtY_9Vg-okzkhaKHQbJnGKAL497SzfG_UylCmcfVXdGzHpqShpcwreeZMusDF41fIiGSHhGJxKc-o9YywFty8-m66_EruYTV9g/s1600/complex-plane-1.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi73uKbx8ZvJkNqM_TOhc6ASxPPhMW2-ca-iHv9Nnm6PZRtY_9Vg-okzkhaKHQbJnGKAL497SzfG_UylCmcfVXdGzHpqShpcwreeZMusDF41fIiGSHhGJxKc-o9YywFty8-m66_EruYTV9g/s400/complex-plane-1.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Another interesting seemingly related concept is the idea of turning number or &lt;a href=&quot; http://en.wikipedia.org/wiki/Winding_number&quot;&gt;winding number&lt;/a&gt; of a curve, the red circle with clockwise rotation corresponds to curve with a winding number of -1 and the blue curve with positive increasing powers of i has a winding number of 1.&lt;br /&gt;
&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;As we saw our group is cyclic and isomorphic to Z&lt;sub&gt;4&lt;/sub&gt; and isomorphic to the rotation subgroup of the dihedral group D&lt;sub&gt;4&lt;/sub&gt; and both of the generators of our group correspond to rotation in the complex plane. Counterclockwise rotation corresponds to the period of i and clockwise rotation corresponds to the period of -i.&lt;br /&gt;
&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/03/interesting-group.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizdyzAtd6c3SEbraqTKIJP4iMbnSRi7dijCozv2lLb5dE0Zvaka9rLxwc10tMBQiIVAW3-AntYh9tjPb6s2GypMmKi41XYd3_wAEJKb-y3jlfscolVAnEJS0It1KieFkdkcpDmb0e5dMJR/s72-c/IMG_7160.JPG" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6918427997759942244.post-7096643175336703846</guid><pubDate>Sun, 25 Mar 2012 17:08:00 +0000</pubDate><atom:updated>2012-05-13T15:08:20.931-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linguistics</category><category domain="http://www.blogger.com/atom/ns#">Morphology</category><category domain="http://www.blogger.com/atom/ns#">Naming</category><category domain="http://www.blogger.com/atom/ns#">Software Engineering</category><category domain="http://www.blogger.com/atom/ns#">Software Frameworks</category><title>More Thoughts on Formal Approaches to Naming in Software</title><description>&lt;h2&gt;On the Importance of Naming in Software Systems, Part II&lt;/h2&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrg1hBRiPR0Ch5z48kQHr1R3beLtLF_so-yLpRv6yvuXE_5NZyggtfnAXy9wmKtrZHnA3gAqvVc7EBa7q40CmB4Pj_L8uELdHm3NE7eiv2e6vJMG0K5rGwtAPTn14wat8iAjuiN3U9VctS/s1600/Io_Full.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left:1em; margin-right:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; width=&quot;400&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrg1hBRiPR0Ch5z48kQHr1R3beLtLF_so-yLpRv6yvuXE_5NZyggtfnAXy9wmKtrZHnA3gAqvVc7EBa7q40CmB4Pj_L8uELdHm3NE7eiv2e6vJMG0K5rGwtAPTn14wat8iAjuiN3U9VctS/s400/Io_Full.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;style&gt;
blockquote.quote {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: url(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3yyYdba2pzcwnG3Y-K94IXdpqIon0Qf6wUnkJ9_peW_uctxGYEzHURU8asiXX14fKIT4V4moP8DjhbSor2kf9iYl06WDXLxWmneky8SnfHT1xq_t1JqKiMxH2OxWeUyuWx-as4xZujsZF/s320/blockquote.white.png) #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}

blockquote.paraphrase {
   border-bottom: #ddd 1px dotted;
   border-left: #ddd 1px dotted;
   padding-bottom: 0.6em;
   font-style: italic;
   font-family: calibri, tahoma, arial, sans-serif;
   margin: 1em 10% 1em 0px;
   min-height: 40px;
   padding-left: 3.8em;
   padding-right: 1em;
   background: #f0f0f0 no-repeat 4px top;
   color: #474747;
   border-top: #ddd 1px dotted;
   border-right: #ddd 1px dotted;
   padding-top: 0.6em
}


div.source-code1 {
    font-family       : Andale Mono, Lucida Console, Monaco, fixed, monospace;
    color             : #000;
    background-color  : #eee;
    font-size         : 12px;
    border            : 1px dashed #999999;
    line-height       : 10px;
    padding           : 5px;
    overflow          : auto;
    width             : 100%;
    text-indent       : 0px;
}

div.source-code {
    font-family       : Andale Mono, Lucida Console, Monaco, fixed, monospace;
    color             : #000;
    background-color  : #eee;
    font-size         : 12px;
    border            : 1px dashed #999999;
    line-height       : 14px;
    padding           : 5px;
    overflow          : auto;
    width             : 100%;
    text-indent       : 0px;
    margin-top        : 8px;
    margin-bottom     : 8px;
}

p.codeline {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    color:black;
}

p.codeline1 {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    text-indent:.5in;
    color:black;
}

p.codeline2 {

    padding: 0px;
    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    text-indent:1in;
    color:black;
}

p.codeline3 {

    margin-top:0in;
    margin-bottom:0in;
    margin-bottom:.0001pt;
    line-height: 12px;
    font-size:10.0pt;
    font-family:&quot;Courier New&quot;;
    text-indent:1.5in;
    color:black;
}

&lt;/style&gt;&lt;!--More Thoughts on Formal Approaches to Naming in Software--&gt;&lt;br /&gt;
&lt;p&gt;In my &lt;a href=&quot;http://www.elegantcoding.com/2012/03/survey-of-conventional-wisdom-on.html&quot;&gt;last post on naming&lt;/a&gt; I surveyed and attempted to categorize the conventional wisdom in regards to naming. Here I will expand on some of my ideas and extend my naming domain vocabulary.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;A software system is composed of many things and most of them if not all have names.  In order to talk about this I realized that I need a term to describe the things that have names, Steve McConnell makes the comment &quot;a variable and a variable’s name are essentially the same thing&quot;.  While this is effectively true, &lt;i&gt;named things&lt;/i&gt; in a system have different types, uses, etc.  In trying to come up with a name for these &lt;i&gt;named things&lt;/i&gt;, I felt that I could do better than the phrase &quot;named things&quot;. For the word &quot;things&quot; I contemplated item, object, entity, artifact, and more. These all had various connotations and possible contexts which confused the meaning. I turned to linguistics for the answer, and found the following on Wikipedia under &lt;a href=&quot;http://en.wikipedia.org/wiki/Intension&quot;&gt;intension&lt;/a&gt;, the bolding is mine:&lt;/p&gt;&lt;br /&gt;
&lt;blockquote class=&quot;quote&quot;&gt;&lt;p&gt;&lt;i&gt;The meaning of a word can be thought of as the bond between the idea or thing the word refers to and the word itself. Swiss linguist &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Ferdinand_de_Saussure&quot; title=&quot;Ferdinand de Saussure&quot;&gt;&lt;i&gt;Ferdinand de Saussure&lt;/i&gt;&lt;/a&gt;&lt;i&gt; contrasts three concepts:&lt;/i&gt;&lt;/p&gt;&lt;br /&gt;
&lt;ul type=disc&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;the signifier&lt;/i&gt;&lt;/b&gt;&lt;i&gt; — the &amp;quot;sound image&amp;quot; or string of &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Letter_%28alphabet%29&quot;      title=&quot;Letter (alphabet)&quot;&gt;&lt;i&gt;letters&lt;/i&gt;&lt;/a&gt;&lt;i&gt; on a page that one recognizes as a &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Sign_%28linguistics%29&quot; title=&quot;Sign (linguistics)&quot;&gt;&lt;i&gt;sign&lt;/i&gt;&lt;/a&gt;&lt;i&gt;.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;the signified&lt;/i&gt;&lt;/b&gt;&lt;i&gt; — the &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Concept&quot;      title=Concept&gt;&lt;i&gt;concept&lt;/i&gt;&lt;/a&gt;&lt;i&gt; or &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Idea&quot; title=Idea&gt;&lt;i&gt;idea&lt;/i&gt;&lt;/a&gt;&lt;i&gt; that a sign evokes.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;i&gt;the referent&lt;/i&gt;&lt;/b&gt;&lt;i&gt; — the actual &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Object_%28philosophy%29&quot; title=&quot;Object (philosophy)&quot;&gt;&lt;i&gt;thing&lt;/i&gt;&lt;/a&gt;&lt;i&gt; or set of things a sign refers to. See &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Sign_%28semiotics%29#Dyadic_signs&quot; title=&quot;Sign (semiotics)&quot;&gt;Dyadic signs&lt;/a&gt;&lt;i&gt; and &lt;/i&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Reference#Semantics&quot; title=Reference&gt;Reference (semantics)&lt;/a&gt;&lt;i&gt;.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;So the word &lt;b&gt;&lt;i&gt;referent&lt;/i&gt;&lt;/b&gt; seems to be a good choice as it probably has no context with relation to software engineering.  To take this further, I will use the expression &lt;b&gt;&lt;i&gt;Named System Referent&lt;/i&gt;&lt;/b&gt;&lt;i&gt; &lt;/i&gt;or possibly just &lt;b&gt;&lt;i&gt;System Referent&lt;/i&gt;&lt;/b&gt; to refer to those things in a software system that have a name.  To be clear here a name is what is referred to above as a &lt;b&gt;&lt;i&gt;signifier&lt;/i&gt;&lt;/b&gt; but I will just use name.  A &lt;b&gt;&lt;i&gt;System Referent&lt;/i&gt;&lt;/b&gt; is the thing (&lt;b&gt;&lt;i&gt;referent&lt;/i&gt;&lt;/b&gt;) in the Software System that the name refers to.  If this is confusing hopefully some examples will help.  Some &lt;b&gt;&lt;i&gt;System Referents&lt;/i&gt;&lt;/b&gt; include but are not limited to the following&lt;sup&gt;1&lt;/sup&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Classes&lt;/li&gt;
&lt;li&gt;Variables (local, instance, static)&lt;/li&gt;
&lt;li&gt;Methods&lt;/li&gt;
&lt;li&gt;Method Parameters&lt;/li&gt;
&lt;li&gt;Packages&lt;/li&gt;
&lt;li&gt;Database Tables, Columns, Triggers, Stored Procedures, etc.&lt;/li&gt;
&lt;li&gt;HTML Files, CSS Files, Javascript Files, Config Files, all files&lt;/li&gt;
&lt;li&gt;Directories&lt;/li&gt;
&lt;li&gt;Urls&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;XML Elements and Attributes&lt;/li&gt;
&lt;li&gt;CSS Classes&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;p&gt;And the list goes on.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Another observation we can make is that &lt;b&gt;&lt;i&gt;System Referents&lt;/i&gt;&lt;/b&gt; can have a context or a grouping, for example &lt;b&gt;&lt;i&gt;System Referents&lt;/i&gt;&lt;/b&gt; which include classes, packages, variables, methods, etc. may have different conventions from other &lt;b&gt;&lt;i&gt;System Referent&lt;/i&gt;&lt;/b&gt; groupings such as database &lt;b&gt;&lt;i&gt;System Referents&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;Now that we have a way to talk about named items, we can explore the very important idea of naming conventions.  The name of a &lt;b&gt;&lt;i&gt;System Referent&lt;/i&gt;&lt;/b&gt; often consists of several components, from a linguistic stand point these components are similar to, but not the same as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Lexical_unit&quot;&gt;lexical unit&lt;/a&gt; or a &lt;a href=&quot;http://en.wikipedia.org/wiki/Morphemes&quot;&gt;morpheme&lt;/a&gt;, for this I am choosing the term &lt;b&gt;&lt;i&gt;Name Unit&lt;/i&gt;&lt;/b&gt;, for example an identifier &quot;personId&quot; consists of two &lt;b&gt;&lt;i&gt;Name Units&lt;/i&gt;&lt;/b&gt;, &quot;person&quot; and &quot;id&quot;. Name units imply a separator mechanism. In this example the use of &lt;a href=&quot;http://en.wikipedia.org/wiki/CamelCase&quot;&gt;CamelCase&lt;/a&gt;, another example is &quot;person_id&quot; where the name units are separated by the separator &quot;_&quot;.  So a &lt;b&gt;&lt;i&gt;name unit&lt;/i&gt;&lt;/b&gt; is that atomic piece of a name that is separated by a separator and a separator is either explicit e.g. &quot;_&quot; or implied e.g. CamelCase. In my previous post we looked at different prefix and suffix qualifiers, this is a generalization of the qualifier concept which deals with the whole name and not just one part of it.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;I wish to compare, from the structural perspective, two common conventions one for the Java &lt;b&gt;&lt;i&gt;System Referent&lt;/i&gt;&lt;/b&gt; grouping and that of an SQL Database grouping.  For the Java Naming convention we will assume the standard Java naming convention.  For the database we will limit ourselves to Tables and Columns and assume uppercase Names, &lt;b&gt;&lt;i&gt;name units&lt;/i&gt;&lt;/b&gt; that consist only of upper case characters, the separator will be an underscore &quot;_&quot;.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;We can define formal a more formal approach to the lexical structure of a naming convention using a &lt;a href=&quot;http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form&quot;&gt;BNF&lt;/a&gt;, or in this case my own variant &lt;a href=&quot;http://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form&quot;&gt;extended BNF&lt;/a&gt;, for example our BNF for variable names in Java might look like the following:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;name-unit-terminal ::= [A-Z]+[a-zA-Z0-9]*&lt;/p&gt;&lt;p&gt;name-unit-prefix-terminal ::= [a-z]+[a-zA-Z0-9]*&lt;/p&gt;&lt;p&gt;&amp;lt;name&amp;gt; ::=  name-unit-prefix-terminal | name-unit-prefix-terminal &amp;lt;name-unit&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;name-unit&amp;gt; ::= name-unit-terminal | name-unit-terminal &amp;lt;name-unit&amp;gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;The Naming convention for our database column names and table names:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;name-unit-terminal ::= [A-Z]+[A-Z0-9]*&lt;/p&gt;&lt;p&gt;&amp;lt;name&amp;gt; ::=  name-unit-terminal | name-unit-terminal &quot;_&quot; &amp;lt;name&amp;gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Two Concrete examples illuminating these are as follows:&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;public class Person {&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;private Long id;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;private String lastName;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;private String firstName;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;private String middle;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;private String phone;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;private String email;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public Long getId() {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;return id;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public void setId(Long value) {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;id = value;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public String getLastName() {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;return lastName;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public void setLastName(String value) {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;lastName = value;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public String getFirstName() {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;return firstName;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public void setFirstName(String value) {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;firstName = value;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public String getMiddle() {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;return middle;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public void setMiddle(String value) {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;middle = value;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public String getPhone() {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;return phone;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public void setPhone(String value) {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;phone = value;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public String getEmail() {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;return email;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;public void setEmail(String email) {&lt;/p&gt;&lt;p class=&quot;codeline2&quot;&gt;this.email = email;&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;
&lt;div class=&quot;source-code&quot;&gt;&lt;p&gt;CREATE TABLE PERSON (&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;ID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;LAST_NAME VARCHAR(40) NULL,&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;FIRST_NAME VARCHAR(20) NULL,&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;MIDDLE VARCHAR(20) NULL,&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;PHONE VARCHAR(20) NULL,&lt;/p&gt;&lt;p class=&quot;codeline1&quot;&gt;EMAIL VARCHAR(256) NOT NULL&lt;/p&gt;&lt;p&gt;);&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
&lt;p&gt;Naming Conventions consist of both a Lexical Component and a Semantic Component. In this post we have focused on the lexical aspects of naming, from the intension definition above we focused on the &lt;b&gt;&lt;i&gt;signifier&lt;/i&gt;&lt;/b&gt; and the &lt;b&gt;&lt;i&gt;referent&lt;/i&gt;&lt;/b&gt;. To really create a comprehensive approach the Semantic aspect cannot be ignored. In the intension definition above this can be viewed as focusing on the &lt;b&gt;&lt;i&gt;signified&lt;/i&gt;&lt;/b&gt; and the &lt;b&gt;&lt;i&gt;referent&lt;/i&gt;&lt;/b&gt;. This is an area that is explored in the idea of the &lt;b&gt;&lt;i&gt;&lt;a href=&quot;http://domaindrivendesign.org/node/132&quot;&gt;Ubiquitous Language&lt;/a&gt;&lt;/i&gt;&lt;/b&gt; within the realm of  Domain Driven Design.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;The Semantic Elements of a system and of a naming convention are more complex and ambiguous. I do think that software systems should have a &lt;b&gt;&lt;i&gt;System Lexicon&lt;/i&gt;&lt;/b&gt; which would be a more concrete formalization and extension of the &lt;b&gt;&lt;i&gt;System’s&lt;/i&gt;&lt;/b&gt; &lt;b&gt;&lt;i&gt;Vocabulary&lt;/i&gt;&lt;/b&gt; or &lt;b&gt;&lt;i&gt;Ubiquitous Language&lt;/i&gt;&lt;/b&gt; this would also incorporate ideas encapsulated in a &lt;a href=&quot;http://en.wikipedia.org/wiki/Data_dictionary&quot;&gt;Data Dictionary&lt;/a&gt;.  A &lt;b&gt;&lt;i&gt;System Lexicon&lt;/i&gt;&lt;/b&gt; would be an entity of some complexity and would require some commitment to build also applying it could be problematic and might require tooling such as an &lt;a href=&quot;http://en.wikipedia.org/wiki/Integrated_development_environment&quot;&gt;IDE&lt;/a&gt; interactive name suggestion feature or a &lt;a href=&quot;http://en.wikipedia.org/wiki/Static_program_analysis&quot;&gt;static analysis&lt;/a&gt; component or both. It might even require an ontology or taxonomy oriented graphical tool for constructing and maintaining the &lt;b&gt;&lt;i&gt;System Lexicon&lt;/i&gt;&lt;/b&gt; depending on the size and complexity of the system.  I will get into some ideas that extend the lexical aspects and move into the Semantic aspects in future posts.  I know that this might seem pretty grandiose but I think this powerful stuff that could lead to better approaches to create higher quality software.&lt;/p&gt;&lt;br /&gt;
&lt;p&gt;&lt;sup&gt;1&lt;/sup&gt;This list is biased to Java Web development, but these ideas should be general enough to span any software system.&lt;/p&gt;</description><link>http://www.elegantcoding.com/2012/03/more-thoughts-on-formal-approaches-to.html</link><author>noreply@blogger.com (elegantcoding)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrg1hBRiPR0Ch5z48kQHr1R3beLtLF_so-yLpRv6yvuXE_5NZyggtfnAXy9wmKtrZHnA3gAqvVc7EBa7q40CmB4Pj_L8uELdHm3NE7eiv2e6vJMG0K5rGwtAPTn14wat8iAjuiN3U9VctS/s72-c/Io_Full.jpg" height="72" width="72"/><thr:total>2</thr:total></item></channel></rss>