<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='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'><id>tag:blogger.com,1999:blog-8086052983184217440</id><updated>2025-12-30T06:36:53.835-05:00</updated><category term="clojure"/><category term="terracotta"/><category term="creativity"/><category term="ruby"/><category term="art"/><category term="blogger"/><category term="blogging"/><category term="css"/><category term="engineering"/><category term="privacy"/><category term="rails"/><category term="science"/><category term="security"/><category term="wordpress"/><title type='text'>Paul Stadig</title><subtitle type='html'>a tinkerer in the art and science of computing machines</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://paul.stadig.name/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>paul</name><uri>http://www.blogger.com/profile/14647609048389725132</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_fF4WuoHXzwE/SRBjhVfrRCI/AAAAAAAAACs/eFo7YomwlZA/S220/n15621912_35516342_3656.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-3864388544497842645</id><published>2025-12-23T04:58:00.000-05:00</published><updated>2025-12-23T04:58:50.857-05:00</updated><title type='text'>Reading &amp; Writing</title><content type='html'>Leslie Lamport knows a thing or two. He&#39;s a Turing Award winner and researcher at Microsoft. He has written influential papers on distributed systems and formal verification.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://www.youtube.com/watch?v=RnY5iJea5ww&quot; target=&quot;_blank&quot;&gt;Leslie Lamport says&lt;/a&gt; you should learn to write well, because people will judge you by your writing, but more importantly it is the key to thinking well. The better you write the better you think the better you write.&lt;br /&gt;
&lt;br /&gt;
But there&#39;s something Leslie didn&#39;t say, he talked about &lt;i&gt;why&lt;/i&gt; to write well, but he didn&#39;t say &lt;i&gt;how&lt;/i&gt; to write well except that writing well comes with practice, which isn&#39;t horrible advice. (The clip is only two minutes long, so cut the guy some slack!)&lt;br /&gt;
&lt;br /&gt;
To write well you must read well.&lt;br /&gt;
&lt;br /&gt;
Moreover, reading, thinking, writing, thinking, reading is the virtuous spiral of 
learning. Reading gives you ideas to think and write about. 
Thinking generates new ideas and integrates them with what you 
already know. Writing tests and refines those 
ideas. Each iteration you are just a little better, a little smarter for
 the effort.&lt;br /&gt;
&lt;br /&gt;
I want to read and write more...&lt;i&gt;a lot more&lt;/i&gt;. I&#39;ve been learning to improve my reading and writing habits.&lt;br /&gt;
&lt;h3&gt;
Reading&lt;/h3&gt;
People read more and more every day. People read Twitter and Facebook and Instagram. People read mommy blogs. People read emails and texts. But this is not a balanced diet. Much of what we read today is short-form, polemic, snark. It is banal. There can be a place for that, but when fed only junk food your mind will get soft and flabby. Your mind needs to get to the gym.&lt;br /&gt;
&lt;br /&gt;
When I say I need to &quot;read more,&quot; what I mean is I need to &quot;read more long-form...mostly books.&quot; I&#39;m also thinking mostly of non-fiction. Yes, you can acquire information through YouTube and podcasts, but that will bias you toward recent ideas and a select group of &quot;content creators&quot; with specialized skills and tools. You can&#39;t easily skim a YouTube video. YouTube and podcasts are no substitute for books.&lt;br /&gt;
&lt;br /&gt;
Through a book you can learn from people who have been dead for 1,000 years. You can learn from kings as easily as from ordinary people who had only pen and paper. You expose yourself to possibilities outside your sphere of experience. There&#39;s a wealth of knowledge available in books, and they aren&#39;t all digitized.&lt;br /&gt;
&lt;br /&gt;
While you are learning something else happens, reading (whether fiction or non-fiction) improves your language skills like spelling, vocabulary, and grammar. You can absorb different writing styles from poets, novelists, journalists, mathematicians. From this soup of styles your own writing voice will emerge.&lt;br /&gt;
&lt;br /&gt;
These benefits will only come to you if you read well.&lt;br /&gt;
&lt;h4&gt;
Read with pen in hand.&lt;/h4&gt;
Research indicates that by engaging with your books you will retain more information longer. Read with pen in hand. Some use their pen for &lt;a href=&quot;https://en.wikipedia.org/wiki/Marginalia&quot; target=&quot;_blank&quot;&gt;marginalia&lt;/a&gt;, but a more effective use will be to write the things you learn on a separate piece of paper in your own words.&lt;br /&gt;
&lt;br /&gt;
To do this you need to summarize the most salient ideas. As you read periodically pause and quiz yourself. What is the author saying? How does this relate to other things you know? This will help you internalize the information as a connected graph of knowledge in your mind. The more connections an idea has the more meaning you impart to it, and the more &quot;handles&quot; you have to grab it and pull it out. &lt;br /&gt;
&lt;br /&gt;
Both for summarizing in my own words and for connecting ideas I sometimes wait until the next day to summarize my reading, without referring back to it. This allows my mind to organize, connect, and highlight the ideas that are important to me. Sometimes I may even re-read something few times over the course of a couple of days to let my mind extract more. (Perhaps only for books that are fertile ground for interesting ideas.)&lt;br /&gt;
&lt;br /&gt;
But after you decide what is important, write it down. You will make best use of the ideas if you keep some notebooks or use a note-taking app. Even if you just throw the notes away you will help your mind retain and comprehend ideas by using your own hand to write the ideas in your own words. You can do this by reading with pen in hand.&lt;br /&gt;
&lt;h4&gt;
Read widely.&lt;/h4&gt;
The more you connect an idea to other ideas the more valuable it becomes. The more you connect an idea to other ideas the more meaning it receives and the more meaning it gives. Reading widely is a great way to fill your mind with a diversity of ideas.&lt;br /&gt;
&lt;br /&gt;
A recommendation system doesn&#39;t help you seek out new ideas. You have to do it. One way to do this is to go to the library, walk up and down the isles, and flip through any book that catches your eye. You may pick up only one idea. That&#39;s great! (I&#39;ll talk more about how to read ruthlessly later.) Browsing is a fine way to break out of your interests. &lt;br /&gt;
&lt;br /&gt;
Sometimes you can get good recommendations from friends, family, acquaintances. Their interests may be similar to yours, but chances are they are not exactly the same. Ask: &quot;what is the most interesting book you have read recently?&quot; You can try asking this of people you know have very different interests from you. Perhaps even start a monthly email thread with the topic &quot;what have you read recently?&quot; If your friends, family, acquaintances have a hard time answering the question, maybe they&#39;ll be encouraged to read more. :)&lt;br /&gt;
&lt;br /&gt;
Reading widely can take a certain amount of humility, especially when you read about ideas that directly oppose your cherished beliefs. You don&#39;t have to change your mind, but try to empathize with the people behind the ideas, their struggles, and their experiences that lead them to believe this thing. Think about the light each idea sheds on all the other things you know, and the value you will get by adding to the richness and subtlety of your knowledge web.&lt;br /&gt;
&lt;br /&gt;
A rich web of knowledge will help you find creative solutions to the problems you face. I believe the most revolutionary ideas are born from the unexpected combination of seemingly unrelated ideas. Read widely to fill out that knowledge web.&lt;br /&gt;
&lt;h4&gt;
Read deeply.&lt;/h4&gt;
Breadth of exposure is helpful for your mind to draw connections between ideas, but so is depth. Your mind is a pattern matching machine. If you give it two ideas it will quickly suss out the similarities and differences.&lt;br /&gt;
&lt;br /&gt;
So if you want to understand the fine distinctions in a subject, read topically. For example, if you want to study the Bible, don&#39;t look for the &quot;best&quot; translation, get them all. If you compare passages among translations you&#39;ll quickly get to the root of translation disagreements, and all without learning a lick of Greek or Hebrew!&lt;br /&gt;
&lt;br /&gt;
When you read a book on a subject, use it as a starting point. Look through its bibliography and sources cited, and go read them. Use the recommendation system at Amazon to find related books. Go to the library shelves that contain a book and check out those near to it. Ask people for recommendations of books similar to ones you&#39;ve read.&lt;br /&gt;
&lt;br /&gt;
As you load your mind with information, it will go to work. It performs magic while you sleep, or while you daydream. Let yourself get bored. Let your mind wander. You&#39;ll think about ideas, how they are the same, and how they are different. Then write it all down. Reading deeply will give your mind plenty of fodder.&lt;br /&gt;
&lt;h4&gt;
Read ruthlessly&lt;/h4&gt;
If you feel your reading list getting much, much longer, then I have good news: &lt;i&gt;you don&#39;t have to read every word&lt;/i&gt;. You don&#39;t even have to finish a book. An author has put a lot of work into a book, and you should accept that gift graciously, but the author has no right to demand your time. Unfortunately &quot;speed reading&quot; doesn&#39;t help here. You should learn to skim, and be OK with not extracting every idea from a book.&lt;br /&gt;
&lt;br /&gt;
When reading broadly, the point is to find new ideas. If there&#39;s a book that looks interesting pick it up. Read the summary. Look through the table of contents. But if the summary and the table of contents don&#39;t induce you to read more, then put it back. If you get half way through the book and lose interest, put it back. Take one idea, and put it back. If that idea tickles your fancy, then make it a subject for a deep read.&lt;br /&gt;
&lt;br /&gt;
Ironically, reading deeply also does not require reading every word of every book. As you read topically you&#39;ll realize that there&#39;s overlapping content. Your first book on a subject may require special attention, but after that you can bound through a book in search of its unique angle.&lt;br /&gt;
&lt;br /&gt;
You alone will have to make an accounting for how you spend your time, and you only have so much of it. Define your reading program based on your own goals and interests, then: Drop. Books. Ruthlessly. Even if it is one that you originally thought would be valuable.&lt;br /&gt;
&lt;br /&gt;
By being ruthless, you will focus on the most potent ideas and build generous knowledge web. No one else will have your unique combination of ideas. Now you must write about them. &lt;br /&gt;
&lt;h3&gt;
Writing&lt;/h3&gt;
Software engineers undervalue writing. Probably this is so in any career. If you write well (emails, chats, texts, pull requests, documentation, ...), you will distinguish yourself. In addition to distinguishing yourself at work, in this internet age you can improve your chances of being discovered. You can write a niche blog and find an audience. You may not find thousands of readers, but you only need one reader to change your life with a job, a speaking engagement, an opportunity.&lt;br /&gt;
&lt;br /&gt;
I could say a lot of things about writing well, but as I&#39;ve read about it I&#39;ve seen four themes: economy, action, warmth, reading.&lt;br /&gt;
&lt;h4&gt;
Economy&lt;/h4&gt;
Writers advise to avoid adverbs and adjectives, to remove qualifiers (&quot;I think,&quot; &quot;some,&quot; &quot;many,&quot; &quot;possibly&quot;), to avoid cliches, to avoid fluff. Most of this advice reduces to using words economically. Say what you want to say briefly and clearly.&lt;br /&gt;
&lt;br /&gt;
If some slip through, that&#39;s OK, because the editing process is 110% about removing words. Pascal famously said &quot;I wish I could have written a shorter letter, but I did not have the time,&quot; because concision is hard. You will re-write, re-write, then re-write some more, and it should get shorter each time.&lt;br /&gt;
&lt;h4&gt;
Action&lt;/h4&gt;
I find this one really tough. As an engineer I usually describe machines and processes. I find it easy to write in a passive voice. (The last sentence was &quot;It is easy for me to write in a passive voice.&quot;) When you write passively, you see state of being verbs. You end up with a pronoun as a subject, and the true subject later in the sentence. It&#39;s all a bit twisty for people to decode. You may find value in tools like writegood-mode for Emacs.&lt;br /&gt;
&lt;h4&gt;
Warmth&lt;/h4&gt;
William Zinsser&#39;s book &lt;i&gt;On Writing Well&lt;/i&gt; is a worthwhile read. In it he advises writing with warmth, which for him is writing about the human element. He reminds me of the great preacher Charles Spurgeon who no matter the passage, Old Testament or New, he would find his way to Jesus. No matter the subject, William will always find his way to a story about people.&lt;br /&gt;
&lt;br /&gt;
Writing about people is one way to achieve warmth. Another way is to write honestly with your own voice. Some people adopt an artificial voice when they write. Perhaps they sound too formal. Find your own voice and be true to it.&lt;br /&gt;
&lt;h4&gt;
Reading&lt;/h4&gt;
There are two ways that reading is important to writing well. First, reading what others have written will improve your language skills and inspire you. You&#39;ll develop an ear for good writing. Second, reading your own writing will help you re-write it. It should sound good to the ear but not in a flowery way, and it should sound like you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/3864388544497842645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/3864388544497842645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3864388544497842645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3864388544497842645'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2019/12/reading-writing.html' title='Reading &amp; Writing'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-1589827251795269554</id><published>2021-05-31T11:32:00.004-04:00</published><updated>2021-05-31T11:33:34.266-04:00</updated><title type='text'>Thoughts on the Death of Brook&#39;s Law</title><content type='html'>&lt;div&gt;Brooks&#39; Law is wrong.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Brooks&#39; Law (the pithy version) is: &quot;adding people to a late project makes it later.&quot; There is some truth to that, but it&#39;s more nuanced. A bad manager staffs up a late project (in an act of desperation?) to make a deadline. However, Bertrand Meyer (and Steve McConnell and Barry Boehm) believe—based on empirical evidence—that judiciously adding people to a project can shorten its schedule.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;You &lt;i&gt;can&lt;/i&gt; shorten a schedule by adding more people...however there&#39;s a limit. You can only shorten the schedule for a software project by (up to) 25%. Since adding people to a software project means adding cost, what this is really saying is you can spend more to get your thing up to 25% more quickly. However, the reverse is not necessarily true. Sometimes you can take people off a project, give the remaining people more time, and get your thing for less money; sometimes you cannot.&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt; This has been known for about 20 years and yet Brooks&#39; Law has survived as a 
folk wisdom, and Bertrand Meyer wants to get the word out. That&#39;s why he
 wrote &lt;a href=&quot;https://cacm.acm.org/magazines/2020/1/241718-in-search-of-the-shortest-possible-schedule/fulltext&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&quot;In Search of the Shortest Possible Schedule.&quot;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I grew up on Brooks&#39; Law, so I&#39;m trying to absorb this. Brooks&#39; Law seems right to me, and in &lt;a href=&quot;https://stevemcconnell.com/articles/brooks-law-repealed/&quot;&gt;&quot;Brooks&#39; Law Repealed?&quot;&lt;/a&gt; Steve McConnell describes an experience that seems familiar:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;To those of us who have been around the software-project block a few 
times, the claim feels true. We’ve participated on projects in which new
 people are brought on at the end. We know the irritation of having to 
answer questions from new staff when we’re already feeling overwhelmed 
about our own work. We’ve seen new hires make mistakes that set the 
whole project back. And we’ve experienced additional schedule slips even
 after staff has been added to a late project.&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;McConnell squares this experience with the new sans Brooks&#39; Law world by pointing out Brooks&#39; Law does apply in certain circumstances, but projects are poorly estimated and poorly tracked. The result is not knowing whether you are in the Brooks&#39; Zone or whether there is enough project left for new hires to pay off the productivity lost to training them.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I&#39;m not sure I buy that. I think the idea of estimation is fundamentally flawed. I can&#39;t help but feel like this is saying, &quot;We&#39;re doing a bad job. Do better!&quot; I&#39;m more and more convinced that breaking work down, estimating the pieces, and rolling it back up is a terrible way to estimate. It fails to account for variability, and padding estimates is not the solution.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;And sure, better project tracking seems like a good thing. It is a necessary first step, but having the data isn&#39;t enough, you also have to interpret and extrapolate it. Probably the best thing that can be done with tracking data is to let it &lt;a href=&quot;http://paul.stadig.name/2017/02/continuous-planning.html&quot;&gt;empirically drive estimations&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I cannot deny the empirical evidence. You can pay more to shorten a project by up to 25%, but there are some intriguing questions that pop up: Why? Why 25%? Why doesn&#39;t it always work backwards? Could you repeat the process with a revised schedule and cut another 25%? How would knowing about this bias estimations?&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;I think what I take away from this is that Brooks&#39; Law has narrower application than I initially expected and adding people to a project &lt;i&gt;can&lt;/i&gt; bring it to completion more quickly.&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/1589827251795269554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/1589827251795269554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/1589827251795269554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/1589827251795269554'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2020/06/thoughts-on-in-search-of-shortest.html' title='Thoughts on the Death of Brook&#39;s Law'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-6129132162054360014</id><published>2019-11-22T08:12:00.000-05:00</published><updated>2019-11-22T11:17:28.273-05:00</updated><title type='text'>On Writing (Code)</title><content type='html'>Introspection into my own process for making software has led me to believe that &lt;a href=&quot;https://twitter.com/pjstadig/status/1159083645405192193&quot;&gt;writing prose&lt;/a&gt; and programming are &lt;a href=&quot;https://twitter.com/einarwh/status/1197468002670788615&quot;&gt;fundamentally the same&lt;/a&gt;.  This was further highlighted for me when I read Stephen King&#39;s &lt;i&gt;On Writing&lt;/i&gt;. I saw interesting parallels between the way he likes to work and the way I like to work.  Also my code is a horror story.&lt;br /&gt;
&lt;br /&gt;
King likes to write a first draft as quickly as possible. He does this to get the story out. He doesn&#39;t worry about character development or even holes in the plot.  Those he will fix up in the second draft.  The first draft is about getting onto paper the good bones of a story.  Then he lets the first draft sit for a couple of weeks.&lt;br /&gt;
&lt;br /&gt;
When he can come back to the first drift and it looks familiar but not quite&amp;#8212;like it was written by his doppelganger&amp;#8212;then he has enough distance to make the second draft.  That&#39;s where any story issues are fixed and things are smoothed out and tightened up.  His goal is to make the story 10% shorter.&lt;br /&gt;
&lt;br /&gt;
When I write code:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I like to write code breadth-first so I can see all the moving parts and that everything fits together.&lt;/li&gt;
&lt;li&gt;I like to let it sit for a couple of minutes, or hours, or days&amp;#8212;whatever I can afford.&lt;/li&gt;
&lt;li&gt;I like to smooth things out and tighten things up in the second draft&amp;#8212;things like function names, refactoring, etc.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Maybe writing code isn&#39;t exactly like writing prose. Maybe it&#39;s more like knitting or woodworking or cycling or &lt;a href=&quot;https://www.youtube.com/watch?v=OUZZKtypink&quot;&gt;solving crimes&lt;/a&gt;.  I think part of the reason that programmers tend to see their work in everything, is that programming is really just process for solving problems and &lt;a href=&quot;http://paul.stadig.name/2016/03/making-fake-things.html&quot;&gt;giving form to thoughts&lt;/a&gt;.  Those skills can be applied to many different domains.  Maybe in that way it actually is more like writing than other hobbies?&lt;br /&gt;
&lt;br /&gt;
At least I didn&#39;t say that programming is like gardening.  I actually appreciate &lt;a href=&quot;http://paul.stadig.name/2018/05/gardening.html&quot;&gt;gardening&lt;/a&gt; as a hobby because of the fact that it is entirely different than making software!&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/6129132162054360014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/6129132162054360014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/6129132162054360014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/6129132162054360014'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2019/11/on-writing-code.html' title='On Writing (Code)'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-4255995258807556564</id><published>2019-11-12T18:15:00.000-05:00</published><updated>2019-11-12T18:15:26.278-05:00</updated><title type='text'>How to Survive Life Undamaged</title><content type='html'>How does one survive life undamaged?  Seriously... if you figure it out let me know.  I particularly mean self-inflicted damage.  You can&#39;t guarantee anything about how other people act or think.&lt;br /&gt;
&lt;br /&gt;
Here is what I have tried (am trying):&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1. Be willing to listen to others.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You don&#39;t have to listen to everyone, but be aware that you risk losing valuable perspective and insight, even if it is insight about how not to do things.  You should probably be willing to listen to some people that you have shut out.  If you are not uncomfortable, then you are not growing.&lt;br /&gt;
&lt;br /&gt;
Everyone has a story.  You can either imagine a person&#39;s story, categorize and label them, and treat them as if that story is true, or you can actually listen.  You can listen to what someone believes while thinking about why they&#39;re wrong and how you will show them, or you can try to inhabit their space and see the world the way they see it.  You don&#39;t have to stay there, but you will take lessons from it.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2. Be skeptical by default.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
To listen to others and inhabit their space does not mean uncritically accepting their ideas.  You can be empathetic, you can entertain an idea, without being swept away.  You can also question if a person is wrong without imagining they are your enemy.&lt;br /&gt;
&lt;br /&gt;
If some idea pushes through your skepticism, accept it.  It is OK to move a little closer towards an &quot;opposite&quot; view.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3. Don&#39;t try to convince everyone.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This can be particularly painful when it is someone you respect and/or love.  It may take time.  Or it may never be.  Life is sour sometimes.  Don&#39;t make it more sour than it needs to be.&lt;br /&gt;
&lt;br /&gt;
If you are skeptical by default, then maybe others are as well?  If you are listening to others and inhabiting their space, then you must know that it will not be easy to convince everyone.  You can let that bother you.  You can turn it into an obsession, or you can focus on the good (what little you estimate there to be) and seek friendship.&lt;br /&gt;
&lt;br /&gt;
These are three things you can try.  If you refuse to listen to others and make it your life goal to convince everyone how they&#39;re wrong.  You will have a life filled with stress and bitterness.  Or you could listen--critically--and seek friendship over rightness.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/4255995258807556564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/4255995258807556564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/4255995258807556564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/4255995258807556564'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2019/11/how-to-survive-life-undamaged.html' title='How to Survive Life Undamaged'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-9164620396881059885</id><published>2019-11-06T20:24:00.001-05:00</published><updated>2019-11-06T20:24:02.773-05:00</updated><title type='text'>Beyond Techniques</title><content type='html'>I firmly believe that writing software is a creative act.  I believe that a construction project---or any other linerally presenting process---is the wrong analogy for software development.  A much better one is writing prose, which is a process of writing and rewriting and rewriting, and sometimes throwing it all out and starting over.  In the same way a software engineer names and renames, factors and refactors, etc., then extends the functionality by doing it all again.  This all has to fit into the larger code base in a way that makes for a consistent whole. This requires judgement and taste.&lt;br /&gt;
&lt;br /&gt;
To come at the argument from the other side, if you spent your days rewriting the same code over and over, then you would split it into more generic functions and perhaps a library.  If you&#39;re solving the same problem that someone else has solved, then you would just reuse their software.  This does in fact happen, and yet software engineers still get paid to work, and the value they generate is in the new stuff that requires creativity.  Sure, there are some inefficiencies that mean people rewrite software that they could have just reused, and you could argue that the new things to be done are increasingly marginal, but on the whole software engineers would be out of work if there were not new things to create.  Ergo writing software is a creative act.&lt;br /&gt;
&lt;br /&gt;
The next reasonable question is: &lt;a href=&quot;http://paul.stadig.name/2018/09/manufacturing-creativity.html&quot;&gt;how does one create?&lt;/a&gt;  I believe that fundamentally, and on average, one cannot directly induce creativity.  This isn&#39;t entirely satisfying.  I wish creativity was a predictable, mechanical process.  Is it possible to discover and categorize tools for thinking?  I&#39;m still exploring that.  Here&#39;s an example: to get a fresh perspective on your problem think not about how to solve it, but how to avoid failing to solve it.  Instead of trying to figure out how to build a stronger bridge, maybe you&#39;ll gain insight by considering how to avoid building a weaker bridge.  This technique for finding fresh perspective...does it not make creating into a predictable, mechanical process?&lt;br /&gt;
&lt;br /&gt;
I actually like techniques.  I believe the learning process is (or is best) technique based.  Think about learning to cook.  You start by following the recipe.  Then you start to improvise.  You understand that this ingredient is for flavor and can be adjusted to taste, but that ingredient provides aeration and messing with it too much will produce a dense, inedible result. Eventually you move beyond techniques and start to construct your own recipes from first principles.  A poor education either starts with first principles, which a beginner does not have the experience to appreciate, or focuses too much on techniques divorced from context, which frustrates learners because they don&#39;t know how to properly &lt;i&gt;apply&lt;/i&gt; techniques.  I intended my book &lt;i&gt;&lt;a href=&quot;http://leanpub.com/clojurepolymorphism/c/CYleb0NF9qJX&quot;&gt;Clojure Polymorphism&lt;/a&gt;&lt;/i&gt; to position itself as a way to explore varied applications of the same tools and techniques, which I hope will guide readers from knowledge into wisdom.&lt;br /&gt;
&lt;br /&gt;
The writing curriculum we use in homeschooling our children is technique based.  A child reads an essay and creates an outline of the important points (there&#39;s a whole set of techniques for that).  Then he will rewrite the essay from the outline applying techniques like &quot;ly&quot;-words, openers, and clinchers.  This removes the hand wringing about &lt;i&gt;what&lt;/i&gt; to write about.  (Incidentally, if you read Ben Franklin&#39;s autobiography, this is the way he improved his own writing.)  What if computer programming was taught this way?  Here&#39;s a program that consumes a CSV file, changes some things, then writes it back out.  First write out a high level algorithm for the program, then rewrite it using 3 of the 15 techniques you&#39;ve learned (concurrency, multimethods, asynchronous channels, etc.).  Repeat.  I think this would produce wiser programmers.&lt;br /&gt;
&lt;br /&gt;
However, eventually you need to move beyond techniques.  Leaning on techniques is just shifting the problem elsewhere.  Coining techniques is an attempt at mechanizing creativity, but instead of making creating mechanical, you are now faced with choosing which technique to apply to generate a creative solution.  Now the creative leap must occur earlier in the process.  You can try each technique in a brute force search, but I doubt many (if any) would consider that &quot;creative,&quot; nor is it particularly efficient.  The experience of repeatedly applying techniques should help you develop judgement and taste, so when you&#39;re faced with inventing from first principles, you have some gut sense or guiding aesthetic.  That guiding aesthetic is not some set of rules for when to apply which techniques.  If it were, then it would become a &quot;library,&quot; so to speak.  Anybody---or any machine--could evaluate the rules and perform the steps.&lt;br /&gt;
&lt;br /&gt;
Techniques are great for broadening your learning, but they are not self applying.  Learning all the techniques does not help you invent new techniques, nor will it induce creativity.  You can know how to cut impeccable dovetails and square up lumber and drill straight holes, but that does not mean you will create beautiful furniture.&lt;br /&gt;
&lt;br /&gt;
How does one develop this guiding aesthetic?  You read a lot of other people&#39;s code.  You write a lot of code.  You read a lot of books.  You work hard.  Sorry, that&#39;s the best I&#39;ve got.  This is a continuing journey...to be continued.&lt;br /&gt;
&lt;br /&gt;
However you do it, the end goal should be to move beyond techniques.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/9164620396881059885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/9164620396881059885' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/9164620396881059885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/9164620396881059885'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2019/11/beyond-techniques.html' title='Beyond Techniques'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-5870272642239346679</id><published>2019-10-30T17:44:00.001-04:00</published><updated>2019-10-30T17:44:07.374-04:00</updated><title type='text'>Virtual Machine Oriented Development</title><content type='html'>Most computing devices that we have today---desktop, laptop or phone---are capable of computing any program that can be computed. There&#39;s a bit of equivocation there. What is meant is that anything that a human can manually calculate via rote, mechanical process can also be done by computer. This is the Church-Turing Thesis.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve never really stopped to think, but what would a non-universal computing machine look like?&lt;br /&gt;
&lt;br /&gt;
.... &lt;br /&gt;
&lt;h4&gt;Longevity&lt;/h4&gt;Several years back I suffered a bout of jealousy. I thought about engineers in other fields who build roads or buildings or even cars. A civil engineer can imagine something they&#39;ve build standing still amidst the blur of 100 years passing by. An automotive engineer can imagine a car they&#39;ve designed still driving the roads in 20 years.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;I don&#39;t think a single line of code that I wrote 3 or more years ago is still in production&lt;/i&gt;, and that&#39;s ignoring all the code that I wrote that never made it into production. &lt;br /&gt;
&lt;br /&gt;
These are the kinds of things you start to ponder as you reach the ripe, old, programmer retirement age of 33.&lt;br /&gt;
&lt;br /&gt;
But then a funny thing happened. I played &lt;a href=&quot;https://en.wikipedia.org/wiki/Sam_%26_Max_Hit_the_Road&quot; target=&quot;_blank&quot;&gt;Sam &amp;amp; Max Hit the Road&lt;/a&gt; ... on my Android &lt;a href=&quot;https://twitter.com/pjstadig/status/510607116730920960&quot; target=&quot;_blank&quot;&gt;phone&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Here was a game released in 1995 and I was playing it on my Android device in 2014. How did that happen? Well, when LucasArts designed the game &quot;Maniac Mansion,&quot; they decided to create a scripting language and write the game in that language, and they used that scripting language for many of the games they made. I have several original LucasArts games on CD. Some are PC versions some are Mac versions.&lt;br /&gt;
&lt;br /&gt;
Over the years as I feel the nostalgia hitting me I&#39;ll grab the game files from the CD and download ScummVM for whatever platform I&#39;m on at the time. I copied the game files to my phone and downloaded ScummVM from the Play store. That&#39;s how it happened.&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;h4&gt;Data is Code&lt;/h4&gt;I had been exposed to Lisp, and even written a lot of Lisp before I finally had my enlightenment about macros and metacircular interpreters. I remember vividly reading &lt;a href=&quot;https://mitpress.mit.edu/sicp/full-text/book/book.html&quot; target=&quot;_blank&quot;&gt;Structure and Interpretation of Computer Programs&lt;/a&gt; and seeing Scheme put to use creating simple yet powerful abstract interpreters. The author&#39;s start &quot;simply&quot; with interpreters that add new programming paradigms to Scheme. Then they proceed to simulating a register machine and writing an assembler and compiler for it. This happens in the last chapter, a space of ~100 pages.&lt;br /&gt;
&lt;br /&gt;
It is a Divine joke that Structure and Interpretation of Computer Programs and The Art of Computer Programming had their titles swapped, because---while I don&#39;t wish to denigrate TAOCP which is a depth of amazing riches---SICP is about art, and in a metacircular way it is art.&lt;br /&gt;
&lt;br /&gt;
It is too easy as a Lisper to understand the world this way, but data is always code. In Forth, 5 is not a number, it is an instruction to push the value 5 onto the top of the program stack. Your program receives a program as input. It receives files, network packets, key presses, and mouse clicks. It interprets this program and produces output.&lt;br /&gt;
&lt;br /&gt;
A PDF file can cause a buffer overrun in a PDF reader because each byte is literally an instruction to your program-as-interpreter to &quot;write a value at the current location and move to the next location&quot; (or at least it can be if your program-as-interpreter has flawed semantics).&lt;br /&gt;
&lt;br /&gt;
This is not a property of Lisp, it is a property of the stored program computer, Universal Turing Machine, von Neumann architecture. Code and data are made of the same stuff and stored in the same memory.&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;h4&gt;The Non-Divine Joke&lt;/h4&gt;In his talk &lt;a href=&quot;https://www.destroyallsoftware.com/talks/the-birth-and-death-of-javascript&quot; target=&quot;_blank&quot;&gt;&quot;The Birth &amp;amp; Death of JavaScript,&quot;&lt;/a&gt; the 2014 version of Gary Bernhardt extrapolates where JavaScript and asm.js will take the world in 2035 (after an apocalyptic global war, of course). The punch line is that instead of JavaScript running on computers, computers run on JavaScript. This happens through a comical stack of emulators emulating emulators that emulate. Actually I think it&#39;s compilers transpiling compilers that transpile transpilers, but...same difference.&lt;br /&gt;
&lt;br /&gt;
But like every joke there&#39;s a bit of truth to it.&lt;br /&gt;
&lt;br /&gt;
Paul Graham writes about &lt;a href=&quot;http://www.paulgraham.com/progbot.html&quot; target=&quot;_blank&quot;&gt;&quot;Programming Bottom-Up&quot;&lt;/a&gt; where you build the language &quot;up&quot; to your program to the point that actually expressing your program becomes somewhat trivial. You&#39;re building a domain specific language to solve exactly the problem you have. Again, this is all too natural for Lispers, but everyone does it.&lt;br /&gt;
&lt;br /&gt;
The act of programming is to turn a universal computing machine into a limited computing machine. You build out data types and operations to focus the abilities of the computer into a specific domain. Programmers instinctively understand this, which is why we find it so funny that---in a twist of irony---a universal computing machine emulates a universal computing machine emulating a universal computing machine.&lt;br /&gt;
&lt;br /&gt;
....&lt;br /&gt;
&lt;h4&gt;Virtual Machine Oriented Development&lt;/h4&gt;I started thinking about Virtual Machine Oriented Development because I was concerned about the transience of my legacy. I noticed that there were software products that were still around 20 years after they were written. I started seeing a VM underneath them.&lt;br /&gt;
&lt;br /&gt;
But having thought about it more, I don&#39;t think that Virtual Machine Oriented Development is just about legacy. I think it might clarify the design process to be explicit about the fact that we&#39;re designing a limited computing machine that analyzes sales data. What are the data types? What are the operations? If you have power users, maybe they&#39;d even like a scripting language that can describe which data to import and then how to analyze it?&lt;br /&gt;
&lt;br /&gt;
You might find then that you&#39;ve abstracted your problem into a computation model that will become valuable for years. Maybe you&#39;ll end up rewriting the interpreter for this language several times, and all the while users can keep using their existing scripts.&lt;br /&gt;
&lt;br /&gt;
.... &lt;br /&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;What does a non-universal computing machine look like? It looks like every program you&#39;ve ever written.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/5870272642239346679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/5870272642239346679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5870272642239346679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5870272642239346679'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2019/10/virtual-machine-oriented-development.html' title='Virtual Machine Oriented Development'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-2941650291037479785</id><published>2019-08-07T13:41:00.000-04:00</published><updated>2019-08-07T13:41:44.707-04:00</updated><title type='text'>Speed Reading</title><content type='html'>My reading habits are lumpy.  I find I&#39;m either not reading anything, or I&#39;m reading seven books at once, and when I am, I wish I could speed read. I have in the past read books on speed reading, and they usually boil down to techniques like increasing your eye span, eliminating regression, eliminating subvocalization, etc.  The theory seems to be that your brain can work much faster than your eyes, and you just need to eliminate bad habits, and establish some better ones, so you can get the words into your brain faster.&lt;br /&gt;
&lt;br /&gt;
I do feel like there&#39;s something to this. In my experience, my mind tends to wander as I&#39;m reading, and sometimes it&#39;s easier to skim since that keeps my mind busier trying to assemble random bits and pieces into a comprehensive whole. That seems to be the idea with this new speed reading book that I picked up called &quot;Speed Reading With The Right Brain.&quot; The author claims that by engaging your brain in conceptualizing what you&#39;re reading as you&#39;re reading, you increase comprehension, and it is through increased speed of comprehension that you achieve increased reading speed.  I want to believe, but I&#39;m still skeptical.&lt;br /&gt;
&lt;br /&gt;
What I would love is some reference that approaches speed reading from an empirical approach, you know, with science.  What do we know that actually works based on research?  Well...you may not like the answer.&lt;br /&gt;
&lt;h4&gt;Speed Reading is Fake&lt;/h4&gt;In looking for an empirically backed approach to speed reading, I came across &lt;a href=&quot;https://journals.sagepub.com/doi/10.1177/1529100615623267&quot;&gt;&quot;So Much to Read, So Little Time: How Do We Read, and Can Speed Reading Help?&quot;&lt;/a&gt; This article is based on decades of reading research and cognitive psychology. One of the authors&amp;mdash;who passed away from cancer a few days after the first draft&amp;mdash;proposed the article &quot;because he felt that it was important to share the knowledge we have gained from experimental science with the general public.&quot;&lt;br /&gt;
&lt;br /&gt;
While there may be savants who can read impossibly fast without sacrificing comprehension, controlled studies show that for normal people learning to read faster means comprehending less.  When you learn to &quot;speed read&quot; you are actually learning to skim.  &quot;Taylor notes that [Evelyn] Wood &#39;repeatedly stated that her people are not skimming, but rather are reading&#39; (Taylor, 1962, p. 65). Based on recordings of their eye movements, however, Taylor concluded that they closely resembled the eye movement patterns produced during skimming (Taylor, 1965; see also Walton, 1957).&quot; Also from the article:&lt;br /&gt;
&lt;blockquote&gt;The speed readers did better than skimmers on general comprehension questions about the gist of the passages but not quite as well as people reading at normal speed. &amp;hellip; The advantage of trained speed readers over skimmers with respect to general comprehension of the text was ascribed by Just and colleagues to an improvement in what they called &lt;i&gt;extended inferencing&lt;/i&gt;. Essentially, the speed readers had increased their ability to construct reasonably accurate inferences about text content on the basis of partial information and their preexisting knowledge. In fact, when the three groups of participants were given more technical texts (taken from &lt;i&gt;Scientific American&lt;/i&gt;), for which background knowledge would be very sparse, the speed readers no longer showed an advantage over the skimmers, even on general questions.&lt;/blockquote&gt;According to the article, learning to speed read may improve your ability to skim, but only for familiar subjects.  This isn&#39;t necessarily bad news for two reasons:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;You &lt;i&gt;can&lt;/i&gt; improve your reading speed, just not as dramatically as speed reading advocates suggest.&lt;/li&gt;
&lt;li&gt;Learning to skim effectively is a useful skill to learn.&lt;/li&gt;
&lt;/ol&gt;&lt;h4&gt;Improve Your Reading Speed&lt;/h4&gt;The average person reads between 200-400 words per minute. What is the best way to improve your reading speed?  Practice.  Unsurprising.  Perhaps a little disappointing?  There are a couple ways that practice increases your reading speed, but they basically break down to improving your language skills:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;better vocabulary&lt;/li&gt;
&lt;li&gt;exposure to more writing styles&lt;/li&gt;
&lt;/ul&gt;The broader your vocabulary, the more familiar you are with words and styles, the more quickly you can read.  Your eyes fixate less on words with which you are familiar, so they move more briskly across the page.  Your familiarity with style allows you to anticipate better how a sentence will end when you&#39;ve only read part of it.  Also, &quot;written language uses some vocabulary and syntactic structures that are not commonly found in speech, and practice with reading can give people practice with these.&quot;&lt;br /&gt;
&lt;br /&gt;
The more you &lt;i&gt;do&lt;/i&gt; reading, the faster you&#39;ll get.[1]&lt;br /&gt;
&lt;h4&gt;Learn to Skim Effectively&lt;/h4&gt;Effective skimming is mostly about trying to extract structure and important ideas from a text.  Scan for:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;headings&lt;/li&gt;
&lt;li&gt;paragraph structure&lt;/li&gt;
&lt;li&gt;key words&lt;/li&gt;
&lt;/ul&gt;According to the article, &quot;Research has shown that readers who pay more attention to headings write the most accurate text summaries (Hyönä, Lorch, &amp; Kaakinen, 2002).&quot;[2]  You can also do things like:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;scan the table of contents&lt;/li&gt;
&lt;li&gt;read the first paragraph of each section&lt;/li&gt;
&lt;li&gt;read the first sentence of each paragraph&lt;/li&gt;
&lt;/ul&gt;Again from the article:&lt;br /&gt;
&lt;blockquote&gt;The eye movements revealed that skimmers tended to spend more time reading earlier paragraphs and earlier pages, suggesting that they used the initial parts of the text to obtain the general topic of passages and provide context for the later parts that they skimmed in a more cursory way. Therefore, effective skimming means making sensible decisions about which parts of a text to select for more careful reading when faced with time pressure. In fact, Wilkinson, Reader, and Payne (2012) found that, when forced to skim, readers tended to select texts that were less demanding, presumably because they would be able to derive more information from such texts when skimming. This kind of information foraging is a useful method of handling large amounts of text in a timely manner.&lt;br /&gt;
&lt;/blockquote&gt;You know what else helps you skim effectively?  Practice.  Practice gives you a broader base of knowledge and experience to draw on:&lt;br /&gt;
&lt;blockquote&gt;That [knowledge/experience] may be the basis for some anecdotes about the speed-reading abilities of famous people, such as that President Kennedy could pick up a copy of the &lt;i&gt;Washington Post&lt;/i&gt; or the &lt;i&gt;New York Times&lt;/i&gt; and read it from front to back in a few minutes. However, consider the knowledge and information that someone like Kennedy would bring to the task of reading the newspaper. As president, he was briefed about important world events each day and was involved in generating much of the policy and events reported in the newspaper; thus, he probably had first-hand knowledge of much of what was described. In contrast, the average person would come to such a situation with very few facts at his or her disposal and would probably have to read an article rather carefully in order to completely understand it. To read rapidly, you need to know enough about a topic to fit the new information immediately into what you already know and to make inferences.&lt;br /&gt;
&lt;/blockquote&gt;Of course, the downside of skimming is that you are skipping over portions of text resulting in lower comprehension.  However, if you&#39;re looking to get a general overview or find one specific fact, then it can be useful.  It may also be good for a first pass at a text before reading in depth.&lt;br /&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;I do feel as though my mind wanders when I read, and I wonder whether there is a way to better engage my mind when reading.  Perhaps conceptualizing or visualizing or some other way of focusing more would help comprehension and speed.  If and until I and figure that out, I can improve my reading speed by practicing and getting better at skimming, when skimming makes sense.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Footnotes:&lt;/b&gt;&lt;br /&gt;
[1] I wonder (off-the-cuff, anecdotally, non-scientifically) whether writing more also improves reading, for the same reason: it improves language skills.&lt;br /&gt;
&lt;br /&gt;
[2] Interestingly, this means that as an author you bear some of the burden for helping readers quickly consume your writing.  I had started to shy away from listicle style blog posts, thinking I&#39;d try to contribute to a more high minded discourse that rewarded effort in reading and comprehending.  This article has more headings and lists...maybe I&#39;ll do a little of both. :)&lt;br /&gt;
&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/2941650291037479785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/2941650291037479785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/2941650291037479785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/2941650291037479785'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2019/08/speed-reading.html' title='Speed Reading'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-3302426807105853571</id><published>2018-09-12T13:27:00.001-04:00</published><updated>2018-09-12T13:27:47.544-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="art"/><category scheme="http://www.blogger.com/atom/ns#" term="creativity"/><category scheme="http://www.blogger.com/atom/ns#" term="engineering"/><category scheme="http://www.blogger.com/atom/ns#" term="science"/><title type='text'>Engineering Synthesis</title><content type='html'>What is the nature of software engineering? How is it different from other kinds of engineering? Why is it so hard?&lt;br /&gt;
&lt;br /&gt;
These are questions I have struggled with for many years. In my work, I have seen more than a few different takes on software engineering. Even when things start out right they seem to end at a sad place, and this has bothered me. Is it really impossible to do software &quot;right?&quot; Or do we just have the wrong idea about how to do it? Software engineering is a relatively new discipline, so maybe we still have some things to learn.&lt;br /&gt;
&lt;br /&gt;
I&#39;m going to draw from several sources here, and try to synthesize some ideas about engineering, science, and art. I feel kind of silly writing all these words summarizing other sources when you could just go watch the videos and read the papers yourself. But for my purposes these sources are a framework for discussing and organizing my thoughts.&lt;br /&gt;
&lt;h4&gt;Real Software Engineering &lt;/h4&gt;&quot;Real Software Engineering&quot; by Glenn Vanderberg &lt;br /&gt;
&lt;a href=&quot;http://www.infoq.com/presentations/Software-Engineering&quot;&gt;http://www.infoq.com/presentations/Software-Engineering&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Glenn Vanderberg is a software practitioner, and he is reacting to the claim that software engineering needs to grow up and become a &quot;real&quot; engineering discipline.  But what is &quot;real&quot; engineering?&lt;br /&gt;
&lt;br /&gt;
There are actually a couple of different versions of this talk available online, and in one Vanderberg takes some time to talk about &quot;how did we get here?&quot;  He digs up some history on the NATO conference in 1968 whose goal was to define software engineering.  He then talks about some commonly believed myths about engineering, about how different engineering disciplines use different methods, then brings it back around to software engineering and applies what we&#39;ve learned.&lt;br /&gt;
&lt;br /&gt;
There were three big ideas from Vanderberg&#39;s talk that stood out to me:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;The model of scientists discovering knowledge and engineers then applying that knowledge is wrong.&lt;/li&gt;
&lt;li&gt;Software engineering is unique because we spend a lot of time crafting design documents and models and a trivial amount of time actually producing the end product, which is the exact opposite of most other branches of engineering.&lt;/li&gt;
&lt;li&gt;Agile methods are the best methods we have and for all practical purposes they &lt;i&gt;are&lt;/i&gt; software engineering.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
When I first watched Vanderberg&#39;s talk years ago, the big idea was the second&amp;#8212;about the uniqueness of software engineering&amp;#8212;but coming back to it later I was surprised to find this first idea echoed in other sources.  Vanderberg gives a examples of advances in knowledge that came not from academics or scientists, but instead from practitioners and engineers. One example is &lt;a href=&quot;https://en.wikipedia.org/wiki/Robert_Maillart&quot; target=&quot;_blank&quot;&gt;Robert Maillart&lt;/a&gt;.  He was an engineer who revolutionized the use of reinforced concrete in bridge building.  He did this before there were mathematical models to explain the uses and limits of reinforced concrete.  Scientific advances are just as likely to come from practitioners as from academics.&lt;br /&gt;
&lt;br /&gt;
My second idea from Vanderberg is that among the kinds of engineering, software engineering has some unique characteristics.  If one were to build a skyscraper, one would construct designs, models, blueprints, then those would be handed over to a construction team who would construct the building.  The blueprints are relatively cheap to produce.  The actual construction is error prone and requires a lot of materials and labor.  Looking at this process, it would seem very important to focus as much effort on the architecting of blueprints as possible.  Once you&#39;ve laid the foundation, it is expensive to rethink the footprint of the building.&lt;br /&gt;
&lt;br /&gt;
If I were to apply this process to software engineering I might do something like the following: Hire a system architect to create a design document, and then get a bunch of code monkeys to actually construct the system by writing code.  In my interpretation, the requirements and design document are the model and blueprints, the system architect is the architect, and the code monkeys are the construction crew.  Vanderberg picked up an insight from Jack Reeves in the 90&#39;s: this interpretation is wrong.&lt;br /&gt;
&lt;br /&gt;
Customers do not pay for code, they pay for an executable.  They want a working system.  That is the constructed product, and it is the compiler not the code monkeys that produces it.  The code is the design document and mathematical model.  The code monkeys are not the construction crew, they are the architects.  Source code and its type systems are a mathematical model that can be formally verified.  Using a compiler, I can produce a prototype from that model instantaneously and for free.  The source code also contains documentation, and to the extent that it has automated tests (also written in the same language) it is self verifying.  Modern high level languages and domain specific languages can even be mostly understood by domain experts.&lt;br /&gt;
&lt;br /&gt;
Software engineering is a unique engineering discipline, because source code is a unique artifact.  We should be careful not to take engineering methods from a discipline where constructing a prototype is time consuming and expensive and one is necessarily forced to spend more time on up front design to avoid that cost.  This will lead nicely into my third big idea, that agile methods are for all practical purposes the best kind of software engineering we know.&lt;br /&gt;
&lt;br /&gt;
When I say agile methods, I mean agile with a little &#39;a&#39;.  I&#39;m thinking (vaguely) of an incremental tinkering approach, versus a straight line mechanical approach.  I&#39;m thinking of a technician approach, versus a technique approach.  Or as the original Agile Manifesto said, &quot;people over process.&quot;  I think they got that right.  What is interesting is they were not the only ones to get it right.  The original NATO conference on software engineering (1968!) had it right before they had it wrong.&lt;br /&gt;
&lt;br /&gt;
There were two NATO conferences that were a year apart.  At the first session Alan Perlis &lt;a href=&quot;http://homepages.cs.ncl.ac.uk/brian.randell/NATO/nato1968.PDF&quot; target=&quot;_blank&quot;&gt;summarized&lt;/a&gt; the discussion on system design:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;A software system can best be designed if the testing is interlaced with the designing instead of being used after the design.&lt;/li&gt;
&lt;li&gt;A simulation which matches the requirements contains the control which organizes the design of the system.&lt;/li&gt;
&lt;li&gt;Through successive repetitions of this process of interlaced testing and design the model ultimately becomes the software system itself. I think that it is the key of the approach that has been suggested, that there is no such question as testing things after the fact with simulation models, but that in effect the testing and the replacement of simulations with modules that are deeper and more detailed goes on with the simulation model controlling, as it were, the place and order in which these things are done.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
What he is saying is:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Test early, test often.&lt;/li&gt;
&lt;li&gt;Take a breadth first approach mocking out what you need so you can get a sense for the overall system.&lt;/li&gt;
&lt;li&gt;Iteratively refine the system and replace the mocks.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
That is suspiciously similar to an incremental development method.  Between the 1968 NATO conference and the 1969 NATO conference things changed, and there was a clear tension between those who thought programming was best done by an expert technician, and those who thought programming was best done mechanistically by someone taught a body of scientific techniques.  At the end of the 1969 conference, Tom Simpson gave a talk called &lt;a href=&quot;https://catenary.wordpress.com/2008/05/14/masterpiece-engineering/&quot; target=&quot;_blank&quot;&gt;&quot;Masterpiece Engineering&quot;&lt;/a&gt; which is oozing with conflicts of technician vs. technique.&lt;br /&gt;
&lt;br /&gt;
There was definitely a lot of political maneuvering at the NATO conferences.  There are some other resources you can investigate if you&#39;d like.  The point is the seeds of agile were there, but for some reason we ended up with 33 years of waterfall.&lt;br /&gt;
&lt;h4&gt;Engineering(,) A Path to Science&lt;/h4&gt;&quot;Engineering(,) A Path to Science&quot; by Richard P. Gabriel &lt;br /&gt;
&lt;a href=&quot;http://www.infoq.com/presentations/Mixin-based-Inheritance&quot;&gt;http://www.infoq.com/presentations/Mixin-based-Inheritance&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&quot;Structure of a Programming Language Revolution&quot; by Richard P. Gabriel&lt;br /&gt;
&lt;a href=&quot;http://dreamsongs.com/Files/Incommensurability.pdf&quot;&gt;http://dreamsongs.com/Files/Incommensurability.pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Richard Gabriel&#39;s talk comes from an interesting perspective.  He was involved in the Lisp community and has an academic background (he earned a PhD), but is not an academic.  After working as a practitioner, he went back to school to earn a Masters of Fine Arts.  Upon returning to the technical community, he felt a paradigm shift had happened while he was gone.  The conferences he used to attend had been renamed and were now focused on academics instead of practitioners.  His entire field--Lisp systems engineering--and its journals had been deleted.&lt;br /&gt;
&lt;br /&gt;
Then he was given the first scientific paper on mix-in inheritance.  Being familiar with previous work done on Lisp based inheritance systems, he felt that this paper was using the same terms to describe some of the mechanisms from the Common Lisp Object System, but the terms had different meaning.  Gabriel felt he was experiencing incommensurability, that a paradigm shift had happened from an engineering focus to a scientific focus, and now &quot;scientific&quot; papers were being written that described, as new, things that engineers had already known, using the same terms but with different meanings.&lt;br /&gt;
&lt;br /&gt;
The talk is definitely worth watching.  It is an interesting personal story intertwined with technical discussions of the previous work versus the paper he had been given.  It is an exploration of whether incommensurability can actually happen and to what extent.  He also challenges the myth that science always precedes engineering.&lt;br /&gt;
&lt;br /&gt;
I&#39;m honestly not sure whether Gabriel intended his talk and paper to have a single point.  Maybe he is mostly interested in relating his personal experience, but this is what I took away:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;In general, science does not always precede engineering, and in particular the relationship between computer science and software engineering is even more complex, because the engineers literally create the reality that the scientists study.&lt;/li&gt;
&lt;li&gt;There are two approaches to software: the systems approach, and the language approach.&lt;/li&gt;
&lt;li&gt;Making engineering subservient to science means throwing away the progress that engineers can and do make.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
This was actually the first talk that started the wheels turning for me on the relationship between science and engineering.  I had been told in college that scientists expand the body of knowledge and engineers apply that body of knowledge.  Gabriel uses as his example the steam engine.  When the steam engine was invented the popular theory used to explain its operation was the Caloric Theory of heat, which stated that there was an invisible, weightless, odorless gas called &quot;caloric&quot; that permeated the Universe.  The amount of caloric in the Universe is constant, and its interaction with air molecules can explain heat and radiation, and from it you can deduce most of the gas laws.  The Caloric Theory was a useful theory with predictive power.  When Laplace adjusted Newton&#39;s pulse equations to account for caloric, he was able to more accurately predict the speed of sound.&lt;br /&gt;
&lt;br /&gt;
Eventually the Caloric Theory was replaced by Thermodynamics, and amazingly steam engines continued to work!  The steam engine was developed by mechanics who observed the relationship between pressure, volume, and temperature.  Whether its operation was explained by the Caloric Theory or Thermodynamics made no difference to them.  Yet, an engineer&#39;s invention can and does spark the curiosity of a scientist to develop a theory to explain how it is that an invention works.  This is even more true in the case of computer software.&lt;br /&gt;
&lt;br /&gt;
The second moral I drew from Gabriel&#39;s talk is that there are (at least) two approaches to software: a systems approach and a language approach.  Gabriel acknowledges that at first he thought the incommensurability that he saw was a difference between an engineering paradigm and a scientific paradigm, but eventually he saw it as a more technically focused conflict between a systems paradigm and a language paradigm.  Perhaps what Gabriel means is that you can approach either systems or languages from an engineering or a scientific perspective.  However, I tend to see systems versus languages as engineering versus science.&lt;br /&gt;
&lt;br /&gt;
The systems paradigm views software as interacting components forming a whole; real stuff doing real things.  The language paradigm views software as abstract signs and rules of grammar conveying meaning.  Good design, from a systems perspective, comes from a skilled technician following good design principles (I would even call it aesthetics).  Good design, from the language perspective, comes from a relatively less skilled technician working within a language that from the outset excludes bad design through grammatical rules and compilers.  The system approach tends to view software as a living organism that is incrementally poked and prodded, changed and observed.  The language approach tends to view software as a series of mathematical transformations, preserving meaning.  If each of the paradigms were a theory of truth, the systems paradigm would be correspondence, and the language paradigm would be coherence.&lt;br /&gt;
&lt;br /&gt;
I see system versus language as engineering versus science.  I view engineering as a bottom up, incremental, tinkering approach, at least when it comes to software and the way I like to practice software engineering.  I view science as a top down, formal, mathematical approach.  I actually like both, and I think both have their place, but when engineering is made subservient to science, we&#39;re actually losing something very important.  When engineers are shut out of conferences and journals, there are discoveries that will be left unpublished, and new scientific theories left untheorized. (This was what Gabriel saw happening.)&lt;br /&gt;
&lt;h4&gt;Computer Programming as an Art &lt;/h4&gt;&quot;Computer Programming as an Art&quot; by Donald Knuth&lt;br /&gt;
&lt;a href=&quot;http://dl.acm.org/ft_gateway.cfm?id=1283929&amp;amp;type=pdf&quot;&gt;http://dl.acm.org/ft_gateway.cfm?id=1283929&amp;amp;type=pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
For those with even a cursory exposure to Computer Science, Donald Knuth needs no introduction.  Knuth is coming from an academic perspective, but even for an academic his perspective is a bit unique.  He has created and maintains several large open source software projects.  This is his ACM Turing Award lecture given in 1974.  He starts by quoting the first issue of the Communications of the ACM (1959).  It claims that for programming to become an important part of computer research and development (to be taken seriously) it needs to transition from being an art to a disciplined science.&lt;br /&gt;
&lt;br /&gt;
The big idea I draw here is: Programming can be art (in the &quot;fine art&quot; sense), which means it is (at least sometimes) a creative endeavor.&lt;br /&gt;
&lt;br /&gt;
Knuth first explores the definition of &quot;art&quot; and &quot;science.&quot;  He looks at their use over time.  Their use was (and is) not consistent.  At times &quot;science&quot; and &quot;art&quot; are used interchangeably.  &quot;Art&quot; was used to describe something made of human intellect, not nature.  Eventually &quot;science&quot; came to mean &quot;knowledge&quot; and &quot;art&quot; came to mean &quot;application.&quot;  Though even that usage is not universal.  To Knuth an &quot;art&quot; is something that is not fully understood and requires some aesthetics and intuition.  A &quot;science&quot; is something well understood.  Something that can be mechanized and automated.  It is something that can be taught to a computer.  Can computer programming be taught to a computer?&lt;br /&gt;
&lt;br /&gt;
Knuth does not think that programming can ever be fully automated.  However, it is still useful to automate as much as possible, since it advances the artistry of programming.  He believes, and cites others, that progress is made not by rejecting art in the name of science, nor science in the name of art, but by making use of both.  He makes reference to C. P. Snow&#39;s &quot;The Two Cultures&quot; as an example of another voicing concern about separating art and science.  At this point when he speaks of art he means something more along the lines of &quot;fine art&quot; than &quot;engineering.&quot;&lt;br /&gt;
&lt;br /&gt;
Knuth goes on to talk of creativity, beauty, art, and style.  He hits on how sometimes resource constraints can force a programmer to come up with an elegant solution, and this has an artistic aspect to it.  He also encourages people to, when it comes to programming, make art for art&#39;s sake.  Programs can be just for fun.&lt;br /&gt;
&lt;br /&gt;
Knuth&#39;s talk is focused on the act of programming, and when he deals with engineering versus science he means with respect to the act of programming.  To what extent can the act of programming be made automatic?  To what extent must it remain a human act of creativity?  This is a little further afield of the previous sources, but Knuth&#39;s insistence on seeing programming as a creative act is the big idea I drew from his talk, and is really the point of his talk.&lt;br /&gt;
&lt;br /&gt;
Given that programming can sometimes be a creative act, it raises a lot of questions in my mind.  Is programming always a creative act?  If programming is a creative act, how should a programming project be managed?  Is the high failure rate of software projects related to this?  Perhaps this ties back into Tom Simpson&#39;s &quot;Masterpiece Engineering&quot; satire.  Imagine a project manager with a room full of artists creating Gantt charts and task dependency graphs to plan out the creation of a new masterpiece!&lt;br /&gt;
&lt;br /&gt;
On the other hand, nothing appeals to the ego more than seeing oneself as a grand master of art. There should be a measure of moderation here. I think there is benefit to trying to understand programming as an artistic (or at least &quot;creative&quot;) endeavor, whatever that means, but we should not go crazy with hubris.&lt;br /&gt;
&lt;h4&gt;Better Science Through Art&lt;/h4&gt;&quot;Better Science Through Art&quot; by Richard P. Gabriel and Kevin J. Sullivan &lt;br /&gt;
&lt;a href=&quot;https://www.dreamsongs.com/Files/BetterScienceThroughArt.pdf&quot;&gt;https://www.dreamsongs.com/Files/BetterScienceThroughArt.pdf&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&quot;Better Science Through Art&quot; by Richard P. Gabriel&lt;br /&gt;
&lt;a href=&quot;https://www.tele-task.de/archive/video/flash/12636/&quot;&gt;https://www.tele-task.de/archive/video/flash/12636/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I have already covered some of Gabriel&#39;s background, but I will say that having been involved and educated in both a technical field and an artistic field gives him a unique perspective on the relationship between science, engineering, and art.&lt;br /&gt;
&lt;br /&gt;
I unfortunately don&#39;t know much about Sullivan&#39;s background, other than he is a professor of computer science at the University of Virginia. His collaboration with Gabriel produced one of my favorite papers ever. I don&#39;t know that I can tease out what should be attributed to whom. I will be basing my comments on Gabriel&#39;s talk, but I don&#39;t intend to attribute everything to him, or to diminish Sullivan&#39;s contributions.&lt;br /&gt;
&lt;br /&gt;
The big ideas I drew from this is:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Science, engineering, and art all have at their core &quot;disciplined noticing.&quot;&lt;/li&gt;
&lt;li&gt;Disciplined noticing is a skill that requires practice.&lt;/li&gt;
&lt;li&gt;The creation of knowledge&amp;#8212;even in the case of science&amp;#8212;requires an abductive leap powered by creative spark. &lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
This is a really great talk, and covers a lot of ground.  It is entertaining, insightful, and very worth watching.  He attacks some common caricatures of science, engineering, and art, and digs into the actual process behind each.  In the end, he finds that there are a lot of similarities to the methods in science, engineering, and art.  It is a process of exploration, discovery, and verification.  He calls it disciplined noticing.&lt;br /&gt;
&lt;br /&gt;
I have found this to be true in my experience.  Just like people have a caricature of science, that it is straight line progress, the monotonic aggregation of knowledge, there&#39;s a similar caricature of software development. My experience has been that writing software is a creative, exploratory process.  Sometimes I go down an alley, but find that I need to back out and take a different turn.  I may write a test, run it, change some code, change a test, run it, think for a while, delete a bunch of code and rewrite it all.&lt;br /&gt;
&lt;br /&gt;
In my experience this process&amp;#8212;writing, evaluating, and rewriting&amp;#8212;has much more in common with writing a novel than constructing a building.&lt;br /&gt;
&lt;h4&gt;Conclusion&lt;/h4&gt;This long meandering post must come to an end. First of all, I would highly recommend looking at each of these cited sources. They will reward you. Perhaps you may even find that I have seen them through my own preconceived notions, and you may draw an altogether different conclusion from them. So be it.&lt;br /&gt;
&lt;br /&gt;
This &quot;conclusion&quot; is not really a conclusion, but a way-point. I started on this journey to understand the nature of software engineering, how it is different from other kinds of engineering, and why it is so hard. I ended up at a place that intuitively I knew I would end. I will not make an absolute statement. I will say that at least sometimes (and in my experience) software development is a creative process more akin to creative writing.&lt;br /&gt;
&lt;br /&gt;
I have also seen that there is a tremendous amount of creativity in both engineering and science. I believe that at the core of engineering, science, and art is a drive to understand and influence the world, which requires observation, testing, and evaluation. I don&#39;t claim to know how to do software engineering &quot;right,&quot; but I don&#39;t think we will ever do it right if we refuse to see that creativity (which is at times unpredictable) is a key part of the effort.&lt;br /&gt;
&lt;br /&gt;
I have learned that both engineering and science are useful for discovering and validating knowledge. Scientists and engineers should collaborate. Neither should be seen a primary at the expense of the other. They can even be seen as external expressions of the same process sometimes using similar tools and techniques.&lt;br /&gt;
&lt;br /&gt;
I have learned that software is unique in engineering. Whereas a blueprint is a written artifact using specialized notation, the building it describes must be brought into existence through a complex error prone process. Code is written using specialized notation, but the gap from code to execution is much smaller. There are pitfalls and challenges, no doubt, but I would like to see how the nature of what we produce can change how we produce it. I&#39;m still holding out hope that the nature of software can change the face of the human organizations that produce it.&lt;br /&gt;
&lt;br /&gt;
Practically, what this all means is that a software engineering process should be iterative. It should embrace unpredictability and allow space for the creative process. In the same way that a painter never thinks his painting is complete, software should be developed in a way that continuously produces value, so the project could be closed down and the product shipped at any point, and the customer is still happy with the result.&lt;br /&gt;
&lt;br /&gt;
So I end back at the beginning with Vanderberg. I don&#39;t think that agile is the last word, but I think it is the best we have so far.&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/3302426807105853571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/3302426807105853571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3302426807105853571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3302426807105853571'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2018/09/engineering-synthesis.html' title='Engineering Synthesis'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-2033060455995645508</id><published>2018-09-12T06:21:00.000-04:00</published><updated>2018-09-12T06:21:10.127-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clojure"/><category scheme="http://www.blogger.com/atom/ns#" term="creativity"/><title type='text'>Manufacturing Creativity</title><content type='html'>&lt;a href=&quot;http://paul.stadig.name/2016/03/making-fake-things.html&quot;&gt;Previously&lt;/a&gt;, I&#39;ve attempted to convince you that making software is a creative act, and I explored the implications for pursuing and managing software engineering.  (By the way, science and engineering are also creative acts, and a great exploration of that idea is &quot;&lt;a href=&quot;http://dreamsongs.com/Files/BetterScienceThroughArt.pdf&quot;&gt;Better Science Through Art&lt;/a&gt;&quot; by Richard P. Gabriel and Kevin J. Sullivan.  Love that paper.)&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been thinking a lot lately about creativity and how it can be encouraged (even manufactured?).  I&#39;ve also been thinking quite a bit about why people do (or do not) take on ambitious projects, and how to survive a years long ambitious project.  I&#39;ve learned some very interesting things that some day I may write about, but I&#39;d like to share what I&#39;ve learned about creativity.&lt;br /&gt;
&lt;br /&gt;
What I&#39;ve discovered about being creative is that even from people in very different lines of work (actors, writers, artists, programmers, scientists, investors) there&#39;s a surprising amount of agreement about how it works.  I&#39;ve also discovered that it is not an innate talent that some people have and some do not.  Everyone has the tools to be creative.&lt;br /&gt;
&lt;br /&gt;
In many ways this goes all the way back to the very first Clojure Conj in October of 2010.  Rich Hickey gave a talk titled &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=f84n5oFoZBc&quot;&gt;Step Away from the Computer&lt;/a&gt;&quot;...actually, it had three titles, and it is best known by one of its other titles &quot;Hammock-Driven Development.&quot;  I was there in person.  I came away with the mistaken impression that the talk was about writing software and solving technical problems.  I now know that making software is a creative act, and Rich&#39;s talk was about how to be creative.&lt;br /&gt;
&lt;br /&gt;
For Rich, the engine of creativity is the &quot;background mind,&quot; which is in contrast to the &quot;waking mind.&quot;  Your waking mind is your normal mode of operation.  It is good at analyzing and thinking critically, but can be too tactical and get stuck in local maxima.  Your background mind is good at making connections, thinking abstractly, and synthesizing.  It can make the leap past local maxima, unfortunately your background mind cannot be tasked directly.  However, you can task it indirectly by obsessively thinking and reading about a particular problem, and, though you can activate it other ways, it is easiest to activate it by sleeping, or relaxing and simulating sleeping (i.e. using a hammock).&lt;br /&gt;
&lt;br /&gt;
So, creativity is an indirect process of a relaxed mental mode that you task by obsessively thinking about a problem, and whose products you only filter after the fact with your normal critical-analytical mental mode.  Now here&#39;s the surprising part, almost everyone who attempts to describe their creative process describes it similarly.  In his essay, &quot;&lt;a href=&quot;http://paulgraham.com/top.html&quot;&gt;The Top Ideas in Your Mind&lt;/a&gt;,&quot; Paul Graham says:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Everyone who&#39;s worked on difficult problems is probably familiar with the phenomenon of working hard to figure something out, failing, and then suddenly seeing the answer a bit later while doing something else. There&#39;s a kind of thinking you do without trying to. I&#39;m increasingly convinced this type of thinking is not merely helpful in solving hard problems, but necessary. The tricky part is, you can only control it indirectly.&lt;/blockquote&gt;&lt;br /&gt;
John Cleese gave a talk on &lt;a href=&quot;https://www.youtube.com/watch?v=Pb5oIIPO62g&quot;&gt;creativity&lt;/a&gt;, and he called the background mind &quot;open mode&quot; and the waking mind &quot;closed mode.&quot;  In your open mode, you are relaxed, less purposeful, curious, and a bit playful.  In your closed mode, you are active, determined, and have a critical eye.&lt;br /&gt;
&lt;br /&gt;
George Land is a business man who &lt;a href=&quot;https://www.youtube.com/watch?v=ZfKMq-rYtnc&quot;&gt;investigated&lt;/a&gt; how to stimulate and direct creativity.  He found there are two kinds of thinking: divergent and convergent.  Divergent thinking is creating new ideas.  Convergent thinking is judging and evaluating ideas.  He did a longitudinal study that found that 98% of 5 year olds exhibit divergent thinking, 30% of 10 year olds, 12% of 15 year olds, and only 2% of adults think divergently.  As a person gets older, he or she is taught to use both divergent and convergent thinking at the same time.  The result is one criticizes and judges ideas before they can fully develop.&lt;br /&gt;
&lt;br /&gt;
Of peculiar interest to me has been what independent game designer Jonathan Blow&amp;#8212;who worked on his successful and influential game Braid for 3.5 years&amp;#8212;has said about creativity and &lt;a href=&quot;https://www.youtube.com/watch?v=d0m0jIzJfiQ&quot;&gt;surviving ambitious projects&lt;/a&gt;.  (Maybe someday Rich will talk about how he survived his own ambitious projects: how to maintain motivation day-to-day, how to fund it, how to plan and pace it, how to finish it.)  The thoughts about ambitious projects are for another time, but what he says about creativity should be familiar by now. Blow says metaphysically you may not buy into the Greek concept of the Muse&amp;#8212;nor may he&amp;#8212;but functionally it is real.  Creativity feels like something external, and you have to get yourself into a relaxed mode to provide opportunity for new ideas, though you cannot guarantee anything.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Tools and Techniques&lt;/h3&gt;&lt;br /&gt;
I hope to find more resources on direct techniques for stimulating creative (e.g. instead of thinking about solving a problem think about how to make in worse and avoid that), but for now I&#39;ve found a lot of agreement about how to encourage creativity in an indirect way.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Obsess about your problem.&lt;/b&gt;  If your subconscious mind (or unconscious mind or background mind or whatever you want to call it) is going to solve a problem for you, then it needs information.  Rich has a lot of great advice about this.  Write down your problem.  Write down what you know.  Write down what you don&#39;t know.  Read about your problem.  Read about related problems.  Pick apart other solutions.  Paul Graham in &quot;The Top Idea in Your Mind&quot; says, &quot;It&#39;s hard to do a really good job on anything you don&#39;t think about in the shower.&quot;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Relax.&lt;/b&gt; For Rich this is lying in a hammock and focusing, thinking through all the information you&#39;ve loaded into your mind.  For Blow, a relaxed state of mind is really a pretty active body.  He likes to find something purely physical that he can enjoy, like going to a club and dancing.  Cleese creates an oasis blocking off time and setting aside other concerns.  He gives himself enough time that he can work through all the TODOs that pop into his head.  He writes them down for later, and gets back to being relaxed and playful.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pace yourself.&lt;/b&gt; Cleese recommends, if you&#39;re going to try to set aside time for creativity, to limit it to no more than an hour and a half, because you&#39;ll need a break.  If you need more time, then do it again the next day.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Be Playful.&lt;/b&gt;  George Land found that children are more creative.  Cleese finds being in a playful mood conducive to creativity, especially when collaborating with others.  Play, imagination, daydreaming all come from or lead to a relaxed state of mind, which accesses your creative mechanism.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Write things down.&lt;/b&gt;  Rich is big on this.  There are several benefits: it helps you think thoroughly, it helps you remember things, it is easy to skim for recall.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Gently keep your mind focused.&lt;/b&gt; Cleese says to be successful you must keep your mind gently around the problem.  You may wander off, but gently come back to it.  Rich uses hammock time not just to relax, but to recall information.  Touch each fact with your mind to keep it fresh, and to make it interesting to your background mind.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Have a dogged persistence.&lt;/b&gt; Cleese sticks with an problem, and doesn&#39;t just take the first idea he comes up with.  Sometimes a creative breakthrough requires persisting through the discomfort, even slight anxiety, of an unsolved problem.  Rich reminds us that since this is an indirect process it may take days, months, or years for a solution to come.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Anti-techniques&lt;/h3&gt;&lt;br /&gt;
How can you destroy creativity?  Easy:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Chase success.&lt;/b&gt; Paul Graham says the way to destroy your creativity is to make money the top idea in your mind.  It tends to consume all your mental energies.  Blow also warns about thinking about success or how others will judge what you do.  These things can easily lead to fear, and as Cleese says you need to feel confident to be able to generate ideas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Obsess about disputes.&lt;/b&gt; Paul Graham talks about how Isaac Newton got involved in disputes and regretted the wasted energy.  This is really just another form of worrying about what other people think.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Make a schedule.&lt;/b&gt; Blow warns about making a schedule, but also admits that we must all deal with schedules.  Rich says his techniques don&#39;t work under pressure.  While Cleese sets aside time to be creative, he recognizes that the process is unpredictable and needs time.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Pre-judge ideas.&lt;/b&gt; You must be open, Cleese doesn&#39;t call it &quot;open mode&quot; for nothing. Brainstorming forbids judging ideas, and as a technique it gets that much right.  George Land found the more we use divergent and convergent thinking together&amp;#8212;in other words the more we try to pre-judge ideas&amp;#8212;the less creative we will be.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Get distracted.&lt;/b&gt; Cleese says you need to create a space free from distractions.  For Blow, even the threat of a distraction can prevent him from relaxing, so he&#39;ll even spend time at a coffee shop for a few hours before heading into the office.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;No humor.&lt;/b&gt;  According to Cleese humor is about two frameworks coming together to make new meaning, and this is also the core of creativity.  If you eliminate humor, then you eliminate creativity.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Live actively and urgently.&lt;/b&gt; If you want to ensure no relaxation happens, if you want to ensure that you are in closed mode, then live urgently and actively.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;
If you&#39;re here you are probably a computer programmer (most likely a Clojure programmer).  That means you&#39;re probably a bit like me.  You&#39;re good at thinking analytically and logically.  You&#39;re good a judging solutions based on correctness, performance, etc.  You&#39;re good at operating in &quot;closed mode.&quot;  These are great skills, and as Cleese says we need both open and closed mode to succeed, open to generate ideas, and closed to execute on them.  We just may need to work on the open mode a bit.&lt;br /&gt;
&lt;br /&gt;
You have the ability to be creative.  You have a relaxed, curious, playful, imaginative self.  There are some techniques that others have used that may help you access your creativity.  They may help you, they may not.  You may need to experiment a bit for yourself.&lt;br /&gt;
&lt;br /&gt;
You cannot fully control this process.  You can only indirectly stimulate creativity, and you cannot guarantee that your mind will solve the problem you want it to solve.  One approach would be to work on several problems at once!  You may also find some fruitful connections between the problems.&lt;br /&gt;
&lt;br /&gt;
To be creative you must be persistent, and you must practice.  I hope this helps you find those imaginative solutions.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/2033060455995645508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/2033060455995645508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/2033060455995645508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/2033060455995645508'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2018/09/manufacturing-creativity.html' title='Manufacturing Creativity'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-7053354721869426771</id><published>2018-05-21T09:00:00.001-04:00</published><updated>2018-05-21T15:23:32.313-04:00</updated><title type='text'>Gardening</title><content type='html'>If you&#39;re like me, you spend 8+ hours a day in front of a screen. About five years ago, I decided that I needed better hobbies than learning new programming languages and writing code for personal projects. I wanted find ways to learn new skills and connect with people. I&#39;ve done that by playing board games at local meetups and building a robot, and I&#39;ve done that with gardening.&lt;br /&gt;
&lt;br /&gt;
Gardening has been incredibly frustrating and incredibly rewarding in a roller-coastery kind of way. I&#39;d like to share my journey with you in an attempt to get you interested in gardening. I&#39;ll share some resources I&#39;ve found interesting and useful.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Why gardening?&lt;/h3&gt;&lt;br /&gt;
I chose gardening for many different reasons. I remember my parents having a garden when I was a kid, and I wanted to have a hobby that my kids could be involved in and excited about. I like to eat things like tomatoes that my wife does not often buy, because no one else (including her) likes them. I wanted to do something outdoors. I wanted to become a little more self-sufficient.&lt;br /&gt;
&lt;br /&gt;
Those are some of my reasons, but maybe you have other reasons. Maybe you&#39;d like to reduce your carbon footprint by producing your own food that doesn&#39;t get shipped half way across the world. Maybe you like the idea that food from your garden is essentially tax-free income. Maybe you want to increase the diversity in your diet and/or help preserve and conserve heirloom food varieties that are endangered. Maybe you don&#39;t want to grow food but flowers providing you with a vibrant, delicate beauty.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;How gardening?&lt;/h3&gt;&lt;br /&gt;
There are many ways to garden from containers to raised beds. One of the things I enjoy about gardening is an entire world of new things to learn. It is a gateway hobby into things like cooking, canning, composting, carpentry, and other words that begin with &#39;c&#39;.&lt;br /&gt;
&lt;br /&gt;
I have focused mostly on fruits and veggies, since I want to be able to eat from my garden, but I&#39;ve also grown (and grow more and more) flowers. I&#39;ve grown some edible flowers and some inedible. It is incredibly satisfying to have some color around the house.&lt;br /&gt;
&lt;br /&gt;
I started small with some containers on my deck. I used a couple of EarthBoxes, then built my own DIY EarthBoxes. I like the sub-irrigated planter (SIP) concept so much that I&#39;m planning on putting in a raised bed SIP in my backyard, automatically fed by rain barrels. If you want to learn more about SIPs, check out &lt;a href=&quot;https://www.youtube.com/albopepper&quot;&gt;https://www.youtube.com/albopepper&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Gardening (like most hobbies) can be as expensive as you let it. You can buy all kinds of gardening gadgets and gizmos. One of my goals is to make gardening as economical as possible. To garden you need:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Plants&lt;/li&gt;
&lt;li&gt;Sun&lt;/li&gt;
&lt;li&gt;Water&lt;/li&gt;
&lt;li&gt;Nutrients&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
The sun part is pretty easy, since my back yard is south facing. I just need to work around the shadows cast by trees and the deck.&lt;br /&gt;
&lt;br /&gt;
You can buy seeds pretty cheaply, but you can also harvest seeds from your plants, so you don&#39;t have to continually buy seed packets. This will only work with open-pollinated (OP) plants. Check out this video to learn about OPs, hybrids, and heirlooms: &lt;a href=&quot;https://www.youtube.com/watch?v=zkMEmkecSHs&quot;&gt;https://www.youtube.com/watch?v=zkMEmkecSHs&lt;/a&gt; Often, it is easier to buy seedlings at a nursery or farmer&#39;s market.&lt;br /&gt;
&lt;br /&gt;
You can also plant perennials like strawberries and asparagus. These don&#39;t need to be replanted every year. You plant them once and you can harvest for years. &lt;br /&gt;
&lt;br /&gt;
You can obviously water your plants with your tap, but rain barrels are a way save money taking advantage of an abundant resource over our heads. You can buy rain barrels, or you can make your own. My water company even gives a $30 rebate each for up to two rain barrels that I install.&lt;br /&gt;
&lt;br /&gt;
Plants need nutrients, and nutrients can be provided by fertilizer.  I still use fertilizer occasionally, but I&#39;ve opted to make my own compost. Unfortunately I don&#39;t have many trees whose leaves I can compost. This is usually the easiest way to make compost. However, I am composting what leaves I have along with grass clippings and cardboard boxes from all my Amazon Prime orders. I compost trimmings from my garden, and kitchen waste. I&#39;m even thinking about getting some composting worms! Here is a video about how ridiculously easy it is to compost: &lt;a href=&quot;https://www.youtube.com/watch?v=n9OhxKlrWwc&quot;&gt;https://www.youtube.com/watch?v=n9OhxKlrWwc&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Lessons Learned&lt;/h3&gt;&lt;br /&gt;
I&#39;ve been gardening about five years, and here are some lessons I&#39;ve learned.&lt;br /&gt;
&lt;h4&gt;Time and timeliness.&lt;/h4&gt;As a software engineer, I work in a field where I&#39;m constantly learning, and there&#39;s a new JavaScript framework every week.  I enjoy being more aware of the weather and seasonal rhythms.  Plants work on a different timescale.  If something goes wrong with the crop this year, I may have to wait another whole year to try again.  That can be frustrating, but it can also be an opportunity both to think over a longer timescale and to be very focused on what is happening right now because the stakes are high.&lt;br /&gt;
&lt;h4&gt;Everything wants to kill your plants.&lt;/h4&gt;In container gardening on my deck I&#39;ve dealt mostly with insects, and there are billions of them. When I moved into raised bed gardening with my strawberry patch, I had to deal with deer eating all the leaves off my strawberries. For the past couple of years it has been impossible for me to grow zucchini or squash, because vine borers have eaten them from the inside out. I&#39;m not necessarily a fan of squishing bugs, but there was nothing more satisfying than digging those buggers out and squishing their fat bodies. It was a kind of anger management program.&lt;br /&gt;
&lt;br /&gt;
The lesson is you need to think about pest management from the beginning.  Talk to your neighbors about what pests they&#39;ve dealt with in their gardens.  Or at least be prepared that the first year could be rough until you know what you up against. When you do know what you&#39;re up against...research!  If you live in the US look up your local cooperative extension website.  Virginia&#39;s has all kinds of great publications for growing things in my region.&lt;br /&gt;
&lt;h4&gt;Your plants want to live&lt;/h4&gt;Even the sun can sometimes be brutal on your plants. I tried seed starting a couple of years ago. The last step is to &quot;harden off &quot; your plants by gently exposing them to the elements. I was a little less than gentle and nearly killed my plants.&lt;br /&gt;
&lt;br /&gt;
After the hardening off incident I felt like a bad plant daddy, but the amazing thing was my plants came back. They want to live. They are partners in this gardening adventure.&lt;br /&gt;
&lt;h4&gt;It is satisfying to make things grow&lt;/h4&gt;It can sometimes be difficult to diagnose what is wrong with a plant: is it overwatered, underwatered, missing some nutrient, etc? Plants are complicated yet fascinating living things. It is worth the effort to understand them and work with them. One of the most fascinating books I&#39;ve read is &lt;em&gt;Botany for Gardeners&lt;/em&gt; by Brian Capon &lt;a href=&quot;http://a.co/7SSM1Wi&quot;&gt;http://a.co/7SSM1Wi&lt;/a&gt;. I really enjoyed Brian&#39;s writing style, and it is a very approachable introduction to cellular function, propagation, and the fascinating life of plants.&lt;br /&gt;
&lt;br /&gt;
In the end there is a lot to learn, and it is hard work, but it is so satisfying to nurture a living thing.&lt;br /&gt;
&lt;h4&gt;It is satisfying to work hard&lt;/h4&gt;I have a personal rule for myself that as much as possible I will refuse to have someone else mow my lawn. It saves money.  I listen to podcasts and audio books. I like to walk around my house and property (only 1/3 acre but still) and see how things are doing. It can be hard work since my yard is mostly a hill, but I like to get the exercise.&lt;br /&gt;
&lt;br /&gt;
Gardening can be hard work, too. One Sunday afternoon, in addition to mowing and edging, I pulled out two bushes (which if you&#39;ve ever done, then you know), and planted an apple tree and six red raspberry canes. I was sunburnt and sore, and paid for it the next day, but it was satisfying, and I&#39;m looking forward to the fruit of my labor (literally!).&lt;br /&gt;
&lt;h4&gt;Play the odds&lt;/h4&gt;I recommend starting small, because like any hobby you can get excited and spend a lot of money before you realize it. However, you also have to know that gardening is about playing the odds, so don&#39;t start too small. When you start seeds, you put three in each hole, and when they sprout you thin them down to just the strongest of the seedlings. If you buy tomato seedlings from a nursery, don&#39;t just buy one, buy two or three. You have to expect that some plants won&#39;t survive.&lt;br /&gt;
&lt;br /&gt;
It can also be helpful to plant more than one kind of thing. You may not get everything you want, but you should plant a diverse mix of plants and enjoy whatever you get. If you only plant cucumbers, then horde of cucumber beetles can destroy everything, but if you also have tomatoes, then it&#39;s not a total wash.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;
Have I accomplished my goal of learning new skills and getting to know people? Absolutely! Of the five houses that border mine three are gardeners, and when I&#39;m out early in the morning tending my garden my neighbors are often out, too. I&#39;ve had chances to get to know them.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve gotten outdoors. I&#39;ve gotten plenty of exercise. My kids are involved and excited about gardening. They even eat things they normally wouldn&#39;t, because we&#39;ve grown them ourselves.&lt;br /&gt;
&lt;br /&gt;
If you want a hobby to get you away from the screen and doing something physical in the real world, then give gardening a go.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/7053354721869426771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/7053354721869426771' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/7053354721869426771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/7053354721869426771'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2018/05/gardening.html' title='Gardening'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-8154406802626313760</id><published>2017-09-07T09:24:00.002-04:00</published><updated>2017-09-07T09:24:59.328-04:00</updated><title type='text'>The Ethics of Software Quality</title><content type='html'>Security professionals are in a hard place. If there is a security breach, they take the fall. However, if they do their job right, no one notices. Further, they may even meet resistance to doing their job right because they are being overly cautious, taking too much time, costing too much money, etc., etc.&lt;br /&gt;
&lt;br /&gt;
I think a software professional who wants to create quality software faces the same challenge. You may deliver quality software, but then get accused of taking too long (according to some arbitrary idea someone has) or &quot;gold plating.&quot; You get compared to co-workers who write code much faster, even though it may have more bugs. Focusing on speed as a primary metric for software development is a race to the bottom.&lt;br /&gt;
&lt;br /&gt;
This is not to say that there aren&#39;t times when something needs to be timeboxed, or a programmer needs to resist &quot;gold plating.&quot; It is possible to fall into a trap of tweaking and refactoring &lt;i&gt;ad infinitum&lt;/i&gt;. However, I don&#39;t find that there is a bright line or objective standard for judging this. Maybe that is because I believe software development to be a creative, exploratory process, so I&#39;m apt to think there&#39;s more than a little taste and discernment.&lt;br /&gt;
&lt;br /&gt;
To produce quality software you must take an ethical approach. What do I mean by this? While it seems obvious that there are ethical issues in software development---for example poor quality software wastes time and money, causes frustration, and in the extreme case can cause damage to property and loss of life---that&#39;s not what I mean.&lt;br /&gt;
&lt;br /&gt;
What I mean by &quot;ethical approach&quot; (and maybe there&#39;s a better term for it) is you must have an intrinsic motivation to create quality software. You have to do it because &quot;it&#39;s the right thing.&quot; You will rarely get support from managers to produce quality software. You will shoulder the blame for quality issues in your code. If your code is beautiful and functional and bug-free, rarely will anyone even notice, let alone commend you.&lt;br /&gt;
&lt;br /&gt;
How can you develop a &quot;software quality conscience&quot;? I don&#39;t have all the answers, but I have a couple of suggestions:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Read good code and read about good code.&lt;/b&gt; If it is garbage in, then it will be garbage out.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Surround yourself by other people who care about quality.&lt;/b&gt; Find a team of like minded people whether it is at work or not.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Keep things in perspective.&lt;/b&gt; I find, as I&#39;m further into my career, that I&#39;ve had bosses bluster at me to get things done by a certain time (&quot;do or die&quot;), and found that it didn&#39;t really have a huge impact on the success or failure of my project or company. Don&#39;t be insubordinate or lazy, but don&#39;t buy into the hype. Be realistic.&lt;/li&gt;
&lt;/ol&gt;
&amp;nbsp;You are responsible for fighting the good fight. So step up. </content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/8154406802626313760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/8154406802626313760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/8154406802626313760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/8154406802626313760'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2017/09/the-ethics-of-software-quality.html' title='The Ethics of Software Quality'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-267619002687118550</id><published>2017-02-27T08:58:00.001-05:00</published><updated>2017-02-28T06:44:43.145-05:00</updated><title type='text'>Continuous Planning</title><content type='html'>&quot;In preparing for battle I have always found that plans are useless, but planning is indispensable.&quot; -- Dwight D. Eisenhower&lt;br /&gt;
&lt;br /&gt;
There is a tension between engineering on the one hand, and on the other hand those who would like to know when the task will be done. A product must be marketed, documented, sold, and supported. &quot;When it&#39;s done,&quot; is useless when you&#39;re trying to sell to a customer against a market full of competitors. However, the software we write gets more complex each day, and the process for bringing it to life is complex. Complexity means unknowns, and unknowns mean uncertainty. A software project is like a hurricane with a cone of uncertainty preceding it. This tension between the desire to know and the reality of uncertainty is a fundamental part of working a software project (and probably other kinds of projects).&lt;br /&gt;
&lt;br /&gt;
Before going too much farther I will state my assumption: a completion date is an output not an input, and the most effective tool for managing a completion date is changing the amount of work you want to do (i.e. &quot;scope&quot;).&lt;br /&gt;
&lt;br /&gt;
You cannot take a date and work backwards. This is no different than taking a date and working forwards. Well actually, there is a big difference. In working forward, you can always push the completion date out. In working backwards you cannot start any earlier than now. The completion date inevitably follows from when you start, how quickly you can work, and how much you are trying to do.&lt;br /&gt;
&lt;br /&gt;
You can spend money on tools, training, consultants, but these each have a time cost.&lt;br /&gt;
&lt;br /&gt;
You can add more people, but in order to establish a context on a project a new person must learn a code base, tools, technologies, personalities of the team, and to do so he or she must take time from an otherwise productive member of the team.&lt;br /&gt;
&lt;br /&gt;
You can have the current team work overtime, but too much of that will cause quality issues and burnout.&lt;br /&gt;
&lt;br /&gt;
You can relax expectations about quality, but that is just trading your future time to get something done more quickly and temporarily.&lt;br /&gt;
&lt;br /&gt;
The best thing you can do to manage a completion date, is to cut the amount of &quot;stuff&quot; you are trying to do, or to rearrange the order of when you will do it, so you get the things you want earlier than you otherwise would have.&lt;br /&gt;
&lt;br /&gt;
Given that a date is an output, as engineers and managers we try to navigate this tension between the desire to know and the reality of uncertainty with planning, but there&#39;s a problem with plans: they&#39;re useless. Imagine planning a single task. When will it be done? Well, if you ask one engineer she will give you an estimate based on her skill and experience. If the task is ever given to another engineer, then that estimate is invalidated. On top of that, an engineer (or human really) is notorious for estimating only the amount of work she must do. She doesn&#39;t think about QA testing, deployment, and data migrations, among other things. Nor does she think to factor in overhead like meetings, filling out time cards, learning new skills, bonding with coworkers, etc.&lt;br /&gt;
&lt;br /&gt;
That is just at the most atomic level of estimation. Once you start to think about collaboration things get more complex. Does our engineer need to get a review from a coworker? That coworker is now being taken off of his task to do the review, which can lead to delays. What if our engineer needs assistance from someone more familiar with a particular technology or part of the code base? What if our engineer wants to brainstorm with another engineer? If our engineer gets delayed then any tasks that were dependent on her task also get delayed.&lt;br /&gt;
&lt;br /&gt;
Now imagine making a plan for a product that spans several teams and tens or hundreds (or thousands??) of people. If you don&#39;t know everything that everyone is working on and how they are all related, then you can&#39;t with certainty plan out anything, and that is only taking into account everything that can be known, there are still unknowns (like if someone may get sick). This is the uselessness of a plan.&lt;br /&gt;
&lt;br /&gt;
Well, a plan is not entirely useless. It is probably very accurate for the tasks that will be started in a few days, but entirely inaccurate for the tasks that will be started in three or six months.&lt;br /&gt;
&lt;br /&gt;
So, there are two problems with a plan: 1) it must be updated to reflect new information, and 2) it fails to take into account the &quot;cone of uncertainty.&quot;&lt;br /&gt;
&lt;br /&gt;
Updating a plan seems easy enough, however the larger the plan the more work it will take to keep updated. One could certainly employ an army of project managers who verify that the task breakdown, estimates, and dependencies have not changed; that you&#39;ve taken into account every meeting, vacation plan, all the testing, deployment, and overhead. Ideally the plan would be updated continuously (so its more of a &quot;dashboard&quot; than a &quot;plan&quot;). More valuable than knowing that three months ago we thought a task should be complete on such and such a date would be knowing when we think it will be completed as of now with all the latest information we have access to, but that would create quite a drag on the entire team.&lt;br /&gt;
&lt;br /&gt;
Even if you could keep the plan up-to-date, it gives the false impression that one can know precisely when a task will be complete. You may be able to predict the completion date of a task that starts tomorrow, but not for a task that will start in three months. Three months provides plenty of time for both knowns and unknowns to change when the task could even start, let alone when it would complete.&lt;br /&gt;
&lt;br /&gt;
Usually, this uncertainty is handled by &quot;padding&quot; the date, but this is not enough. A single point-in-time completion date conveys certainty, and this is certainly wrong. The completion of a task should always be a range, one that is narrow for the near future and wide for the distant future. &lt;br /&gt;
&lt;br /&gt;
Incidentally, I think even agile burndown charts get this wrong. In my opinion, there is (and should be) variability to a team&#39;s velocity. Simply taking some velocity value and running it out a few months to predict a single point in time when a task will be complete is at odds with reality.&lt;br /&gt;
&lt;br /&gt;
What does Continuous Planning look like? Well I don&#39;t really know, because I just made it up! At a high level I would summarize it as: plan using real data, with task completion &lt;i&gt;ranges&lt;/i&gt;, over as long a term as you want, in aggregate, on average, continuously. The task completion ranges are the key. You can plan over as long a term as you want, however, the ranges will get wider. If you can reduce the variability in your process---and prove it with your data---then you can narrow the ranges. Planning is done in aggregate and on average, because it is impossible to know and manage every possible factor, so we must abstract away much of the minutiae. Finally, to plan continuously implies some kind of tool to facilitate.&lt;br /&gt;
&lt;br /&gt;
To the extent that I have thought about how this would work out practically, this is what I would do:&lt;br /&gt;
&lt;br /&gt;
Each team would estimate their tasks by each member recording the number of hours he or she thinks it would take him or her to complete the task, given that there are no other distractions. This is a kind of pure estimation that engineers usually make. It would be helpful to discuss the task as a team, and try to elicit different opinions on the complexity of the task, so the estimates will be as complete as possible.&lt;br /&gt;
&lt;br /&gt;
Why not use story points? I have been a fan of story points precisely because they abstract away hours. Hours can vary depending on a persons skill and experience. Hours can get lengthened by interruptions and discovering additional complexity. Hours give a false impression that they would map directly to calendar time, and you can accurately predict when a task will complete.&lt;br /&gt;
&lt;br /&gt;
However, the first thing a person asks is how long does X points take. Usually you have to pick as a standard comparison some &quot;golden story&quot; for a certain number of points. People will usually consciously or unconsciously come up with some rule of thumb like, &quot;an eight point story should take about a sprint to complete.&quot; So in the end you are estimating in hours, but they&#39;re a convoluted form of hours.&lt;br /&gt;
&lt;br /&gt;
Hours are a natural unit for estimations. The danger in using hours is actually trusting the estimate for a precise completion date. We&#39;ve already rejected precise completion dates with Continuous Planning, and the rest of the process is designed around (automatically) finding an accurate scale with which to judge these estimates. I would actually advocate that the estimates and velocities be hidden variables, and (other than your own estimate) you only see the completion range for a task. This would hopefully reduce some confused expectations around what it means for an estimate to be denominated in hours.&lt;br /&gt;
&lt;br /&gt;
The estimates from each team member would be combined together into a single estimate for the task. The method for combination could be taking an average. It could involve throwing out extreme values first, or doing some sophisticated statistical analysis.&lt;br /&gt;
&lt;br /&gt;
Having done these estimates, a task tracking system would keep track of when tasks started and when they completed, or how long they&#39;ve been started even if not complete. This actual data can be used to calculate a velocity. The velocity could be calculated at several levels. You could calculate the velocity for an individual task, for a particular team member, for the team as a whole. You could even calculate the velocity for a feature epic cutting across several teams.&lt;br /&gt;
&lt;br /&gt;
To calculate a date range for completion, you can take the average plus or minus a standard deviation for a single velocity calculation over time and get an optimistic and pessimistic velocity. You could get an optimistic and pessimistic velocity by taking the minimum and maximum of the most recent velocity calculations at two different level (task and team, for example). I&#39;m not sure which would work best; it warrants some research.&lt;br /&gt;
&lt;br /&gt;
Tasks would be a hierarchical tree. An epic is really just a task with subtasks. The velocities and estimates can flow up the tree for the purposes of calculating estimated completion ranges for epics.&lt;br /&gt;
&lt;br /&gt;
If you wanted to get fancy, you could draw dependencies between tasks, and the system could then attempt some kind of topological sort of the tasks, and using a prioritized backlog and team assignments to each task, construct a plan for what could be done in parallel, and---based on velocities calculated from real data--calculate a completion range for each task, epic, and the project as a whole.&lt;br /&gt;
&lt;br /&gt;
As you can see there are still many questions to be answered. I think this is an idea worth exploring. In my experience, the usual tools fall flat at resolving the tension between the desire to know and the reality of uncertainty.&lt;br /&gt;
&lt;br /&gt;
To effectively attack this tension requires abstracting away much of the minutiae of detailed planning by embracing the variability of the process. The plan is useless. Planning is indispensable. Therefore, plan continuously&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
In preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
In preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
In preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
In preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
In preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
n preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
n preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
&lt;div style=&quot;left: -99999px; position: absolute;&quot;&gt;
n preparing for battle I have always found that plans are useless, but planning is indispensable.&lt;br /&gt;
Read more at: https://www.brainyquote.com/quotes/quotes/d/dwightdei164720.html&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/267619002687118550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/267619002687118550' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/267619002687118550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/267619002687118550'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2017/02/continuous-planning.html' title='Continuous Planning'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-796207885414004072</id><published>2016-08-30T14:01:00.000-04:00</published><updated>2016-09-03T06:20:13.894-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clojure"/><title type='text'>&quot;Clojure Polymorphism&quot; Released!</title><content type='html'>From my new blog &lt;a href=&quot;http://realworldclojure.wordpress.com/&quot;&gt;Real World Clojure&lt;/a&gt;. What am I doing with this new blog? I have no idea, but you can follow along.&lt;br /&gt;
&lt;br /&gt;
~ ~ ~ ~&lt;br /&gt;
&lt;br /&gt;
I have released a short e-book (30 pages) titled &quot;Clojure Polymorphism.&quot; You can get 50% off by using this coupon link &lt;a data-mce-href=&quot;http://www.leanpub.com/clojurepolymorphism/c/ONeJZ629Isy7&quot; href=&quot;http://www.leanpub.com/clojurepolymorphism/c/ONeJZ629Isy7&quot;&gt;http://www.leanpub.com/clojurepolymorphism/c/ONeJZ629Isy7&lt;/a&gt;.&lt;br /&gt;
What is this book about?&lt;br /&gt;
&lt;blockquote&gt;
When  it comes to Clojure there are many tutorials, websites, and books about  how to get started (language syntax, set up a project, configure your  IDE, etc.). There are also many tutorials, websites, and books about how  language features work (protocols, transducers, core.async). There are  precious few tutorials, websites, and books about when and how to use  Clojure&#39;s features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;section class=&quot;about-book-copy&quot;&gt;&lt;div class=&quot;trimmed expanded&quot;&gt;
&lt;div class=&quot;cms-content&quot;&gt;
This  is a comparative architecture class. I assume you are familiar with  Clojure and even a bit proficient at it.&amp;nbsp; I will pick a theme and talk  about the tools Clojure provides in that theme.&amp;nbsp; I will use some example  problems, solve them with different tools, and then pick them apart for  what is good and what is bad.&amp;nbsp; There will not be one right answer.&amp;nbsp;  There will be principles that apply in certain contexts.&lt;br /&gt;
I this  installment, I will pick up the theme of &quot;Polymorphism&quot; looking at the  tools of polymorphism that Clojure provides. Then I take a couple of  problems and solve them several ways. At the end of it all, we look back  at the implementations and extract principles. The end goal is for you  to develop an understanding of tradeoffs and a taste for good Clojure  design.&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;&lt;/blockquote&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;section class=&quot;about-book-copy&quot;&gt;I  have some ideas for other e-books. Perhaps a concurrency tour of  Clojure taking a look at futures, STM, reducers, core.async, etc. Or  maybe talk about identity by looking at &lt;code&gt;atom&lt;/code&gt;, &lt;code&gt;agent&lt;/code&gt;, &lt;code&gt;ref&lt;/code&gt;, &lt;code&gt;volatile!&lt;/code&gt;, etc. Or maybe look at code quality tools. Or how to organize namespaces. Or adding a new data structure with &lt;code&gt;deftype&lt;/code&gt;?&lt;/section&gt;&lt;section class=&quot;about-book-copy&quot;&gt;&lt;br data-mce-bogus=&quot;1&quot; /&gt;&lt;/section&gt;What would you like to see? &lt;a data-mce-href=&quot;https://realworldclojure.wordpress.com/contact/&quot; href=&quot;https://realworldclojure.wordpress.com/contact/&quot;&gt;Contact&lt;/a&gt; me. :)</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/796207885414004072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/796207885414004072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/796207885414004072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/796207885414004072'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2016/08/clojure-polymorphism-released.html' title='&quot;Clojure Polymorphism&quot; Released!'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-3197178619595143797</id><published>2016-08-19T13:15:00.001-04:00</published><updated>2016-09-03T06:20:26.785-04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="clojure"/><title type='text'>Reducible Streams</title><content type='html'>Laziness is a great tool, but there are some gotchas.  The classic:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;(with-open [f (io/reader (io/file some-file))]
  (line-seq f))
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;code&gt;line-seq&lt;/code&gt; will return a lazy seq of lines read from &lt;code&gt;some-file&lt;/code&gt;, but if the lazy seq escapes the dynamic extent of &lt;code&gt;with-open&lt;/code&gt;, then you will get an exception:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;IOException Stream closed  java.io.BufferedReader.ensureOpen (BufferedReader.java:115)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
With laziness, the callee produces data, but the caller can control when data is produced.  However, sometimes the data that is produced has associated resources that must be managed.  Leaving the caller in control of when data is produced means the caller must know about and manage the related resources.  Using a lazy sequence is like co-routines passing control back and forth between the caller and callee, but it only transfers control for each item, there is no way to run a cleanup routine after the caller has decided to stop consuming the sequence.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
A Tempting Solution&lt;/h3&gt;
One might immediately think about putting the resource control into the lazy seq:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;(defn my-line-seq* [rdr [line &amp;amp; lines]]
  (if line
    (cons line (lazy-seq (my-line-seq* rdr lines)))
    (do (.close rdr)
        nil)))

(defn my-line-seq [some-file]
  (let [rdr (io/reader (io/file some-file))
        lines (line-seq rdr)]
    (my-line-seq* rdr lines)))
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This way the caller can consume the sequence how it wants, but the callee remains in control of the resources.  The problem with this approach is the caller is not guaranteed to fully consume the sequence, and unless the caller fully consumes the sequence the file reader will never get closed.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
An Actual Solution&lt;/h3&gt;
There is a way to fix this.  You can require the caller to pass in a function to consume the generated data, then the callee can manage the resource and execute the function.  It might look something like:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;(defn process-the-file [some-file some-fn]
  (with-open [f (io/reader (io/file some-file))]
    (doall (some-fn (line-seq f)))))

(process-the-file my-file-name do-the-things)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Once upon a time clojure.java.jdbc used to have a &lt;code&gt;with-query-results&lt;/code&gt; macro that would expose a lazy seq of query results, and you had these resource management issues.  Then it was changed to use this second approach where you pass in functions.&lt;br /&gt;
&lt;br /&gt;
There is a hitch to this approach.  Now the callee has to know more about how the caller&#39;s logic works.  For instance, in the above code you are assuming that &lt;code&gt;some-fn&lt;/code&gt; returns a sequence that you can pass to &lt;code&gt;doall&lt;/code&gt;, but what if &lt;code&gt;some-fn&lt;/code&gt; reduces the sequence of lines down to a scalar value?  Perhaps &lt;code&gt;process-the-file&lt;/code&gt; could take two functions &lt;code&gt;seq-fn&lt;/code&gt; and &lt;code&gt;item-fn&lt;/code&gt;:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;(defn process-the-file [some-file item-fn seq-fn]
  (with-open [f (io/reader (io/file some-file))]
    (seq-fn (map item-fn (line-seq f)))))

(process-the-file my-file-name do-a-thing identity)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
That&#39;s better?  I still see two problems:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The caller is back to having to know/worry about resource management, because it could pass a &lt;code&gt;seq-fn&lt;/code&gt; that does not fully realize the lazy seq before it escapes the &lt;code&gt;with-open&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The logic hooks that &lt;code&gt;process-the-file&lt;/code&gt; provides may never be quite right.  What about a hook for when the file is open?  How about when it is closed?&lt;/li&gt;
&lt;/ol&gt;
I could argue that this whole situation is worse, since the caller still has to worry about resource management, and now the callee has this additional burden of trying to predict all of the logic hooks the caller might want.&lt;br /&gt;
&lt;br /&gt;
An additional design consequence is that you are inverting control from what it was in the lazy seq case.  Whereas before the caller had control over when the data is consumed, now the callee does.  You have to break your logic up into small chunks that can be passed into &lt;code&gt;process-the-file&lt;/code&gt;, which can make the code a bit harder to follow, and you must put your sharded logic close to the callsite for &lt;code&gt;process-the-file&lt;/code&gt; (i.e. you cannot take a lazy sequence from &lt;code&gt;process-the-file&lt;/code&gt; and pass it to another part of your code for processing).  There are advantages and disadvantages to this consequence, so it is not necessarily bad, it is just something you have to consider.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Another Solution&lt;/h3&gt;
We can also solve this by using a different mechanism in Clojure: reduction.  Normally you would think of the reduction process as taking a collection and producing a scalar value:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;(defn process-the-file [some-file some-fn]
  (with-open [f (io/reader (io/file some-file))]
    (reduce (fn [a v] (conj a (somefn v)) [] (line-seq f))))

(process-the-file my-file-name do-a-thing)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
While this may look very similar to our first attempt, we have some options for improving it.  Ideally we&#39;d like to push the resource management into the reduction process and pull the logic out.  We can do this by reifying a couple of Clojure interfaces, and by taking advantage of transducers.&lt;br /&gt;
&lt;br /&gt;
If we can wrap a stream in an object that is reducible, then it can manage its own resources.  The reduction process puts the collection in control of how it is reduced, so it can clean up resources even in the case of early termination.  When we also make use of transducers, we can keep our logic together as a single transformation pipeline, but pass the logic into the reduction process.&lt;br /&gt;
&lt;br /&gt;
I have created a library called &lt;a href=&quot;https://github.com/pjstadig/reducible-stream/&quot;&gt;pjstadig/reducible-stream&lt;/a&gt;, which will create this wrapper object around a stream.  There are several functions that will fuse an input stream, a decoding process, and resource management into an reducible object.  Let&#39;s take a look at them:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;decode-lines!&lt;/code&gt; will take an input stream and produce a reducible collection of the lines from that stream.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;decode-edn!&lt;/code&gt; will take an input stream and produce a reducible collection of the objects read from that stream (using clojure.edn/read).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;decode-clojure!&lt;/code&gt; will take an input stream and produce a reducible collection of the objects read from that stream (using clojure.core/read).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;decode-transit!&lt;/code&gt; will take an input stream and produce a reducible collection of the objects read from that stream.&lt;/li&gt;
&lt;/ul&gt;
Finally, there is a &lt;code&gt;decode!&lt;/code&gt; function that encapsulates the general abstraction, and can be used for some other kind of decoding process. Here is an example of the use of &lt;code&gt;decode-lines!&lt;/code&gt;:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;pre&gt;&lt;code&gt;(into []
      (comp (filter (comp odd? count))
            (take-while (complement #(string/starts-with? % &quot;1&quot;))))
      (decode-lines! (io/input-stream (io/file &quot;/etc/hosts&quot;))))
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
This code will parse &lt;code&gt;/etc/hosts&lt;/code&gt; into lines keeping only lines with an odd number of characters until it finds a line that starts with the number &#39;1&#39;.  Whether the process consumes the entire file or not, the input stream will be closed.&lt;br /&gt;
&lt;br /&gt;
Advantages:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;This reducible object can be created and passed around to other bits of code until it is ready to be consumed.&lt;/li&gt;
&lt;li&gt;When the object is consumed either partially or fully the related resources will be cleaned up.&lt;/li&gt;
&lt;li&gt;Logic can be defined separately and in total (as a transducer), and can be applied to other sources like channels, collection, etc..&lt;/li&gt;
&lt;/ul&gt;
Disadvantages:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;This object can only be consumed once.  If you try to consume it again, you will get an exception because the stream is already closed.&lt;/li&gt;
&lt;li&gt;If you treat this object like a sequence, it will fully consume the input stream and fully realize the decoded data in memory.  In certain uses cases this may be an acceptable tradeoff for having the resources automatically managed for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
Summary&lt;/h3&gt;
Clojure affords you several different tools for deciding how to construct your logic and manage resources when you are processing collections.  Laziness is one tool and it has advantages and disadvantages.  It&#39;s main disadvantage is around managing resources.&lt;br /&gt;
&lt;br /&gt;
By making use of transducers and the reduction process in a smart way, we can produce an object that can manage its own resources while also allowing collection processing logic to be defined externally.  The library &lt;a href=&quot;https://github.com/pjstadig/reducible-stream&quot;&gt;pjstadig/reducible-stream&lt;/a&gt; provides a way to construct these reducible wrappers with decoding and resource management fused to a stream.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Acknowledgments&lt;/h3&gt;
&lt;br /&gt;
Special hat tip to &lt;a href=&quot;https://twitter.com/hiredman_&quot;&gt;hiredman&lt;/a&gt;.  His &lt;a href=&quot;https://ce2144dc-f7c9-4f54-8fb6-7321a4c318db.s3.amazonaws.com/reducers.html&quot;&gt;treatise&lt;/a&gt; on reducers is well worth the read.  Many moons ago it got me started thinking about these things, and I think with transducers on the scene, the idea of a collection managing its own resources during reduction is even more interesting.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/3197178619595143797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/3197178619595143797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3197178619595143797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3197178619595143797'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2016/08/reducible-streams.html' title='Reducible Streams'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-9183005819071347374</id><published>2016-05-09T09:07:00.000-04:00</published><updated>2016-05-09T09:07:51.723-04:00</updated><title type='text'>The March of Technology</title><content type='html'>&lt;blockquote&gt;&quot;Our inventions are wont to be pretty toys, which distract our attention from serious things. They are but improved means to an unimproved end, an end which it was already but too easy to arrive at; as railroads lead to Boston or New York. We are in great haste to construct a magnetic telegraph from Maine to Texas; but Maine and Texas, it may be, have nothing important to communicate. Either is in such a predicament as the man who was earnest to be introduced to a distinguished deaf woman, but when he was presented, and one end of her ear trumpet was put into his hand, had nothing to say. As if the main object were to talk fast and not to talk sensibly. We are eager to tunnel under the Atlantic and bring the Old World some weeks nearer to the New; but perchance the first news that will leak through into the broad, flapping American ear will be that the Princess Adelaide has the whooping cough. After all, the man whose horse trots a mile in a minute does not carry the most important messages; he is not an evangelist, nor does he come round eating locusts and wild honey. I doubt if Flying Childers ever carried a peck of corn to mill.&quot;&lt;/blockquote&gt;Thoreau, Henry David. &lt;i&gt;Walden, and on the Duty of Civil Disobedience.&lt;/i&gt; Project Gutenberg. Web. 09 May 2016. https://www.gutenberg.org/&lt;br /&gt;
&lt;br /&gt;
Or in the words of a more modern philosopher and poet:&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAD27ShgkTJjFCiwxyDkdiRv_zoTjdygdTa8MaZGHhSdEdPSXu1A4mtjPq0PuM7x8_rA_cjEVFrjiklE8H6LrNGxWTR-3td1KePNmSLSW4DU8GM8GshnI5AUXMj9Fg6FfAJUQrdmUrpAw/s1600/anigif_optimized-26314-1433990758-8.gif&quot;/&gt;</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/9183005819071347374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/9183005819071347374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/9183005819071347374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/9183005819071347374'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2016/05/the-march-of-technology.html' title='The March of Technology'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAD27ShgkTJjFCiwxyDkdiRv_zoTjdygdTa8MaZGHhSdEdPSXu1A4mtjPq0PuM7x8_rA_cjEVFrjiklE8H6LrNGxWTR-3td1KePNmSLSW4DU8GM8GshnI5AUXMj9Fg6FfAJUQrdmUrpAw/s72-c/anigif_optimized-26314-1433990758-8.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-2159484258107506594</id><published>2016-03-05T15:31:00.001-05:00</published><updated>2016-03-07T14:21:06.263-05:00</updated><title type='text'>Making Fake Things</title><content type='html'>Software is fake.  There are bits inside a computer represented by a magnetic or electrical charge or mechanical potential or some such thing.  But software is not an electrical charge.  Electrical charges can represent ones and zeroes and a series of ones and zeroes like &quot;10111101&quot; can represent the JVM opcode &quot;anewarray&quot; or the fraction one-half (&quot;½&quot;) in the ISO-8859-1 character encoding or the number -67 in twos-complement.  Software is not electrical charges, it is a particular interpretation imposed on electrical charges.  An interpretation does not weigh anything.  It has no color, taste, temperature, volume, mass, or any physical features.  It is fake, but fake things can be useful.&lt;br /&gt;
&lt;br /&gt;
Fake things can represent real things (or other fake things).  For example, you can represent a couch with a 3D model in a computer.  You can represent cities and towns and roads with fake things.  You can also represent fake things with other fake things.  JVM opcodes, characters, and numbers are all fake things represented by &quot;10111101&quot;, which is fake.  Fake things are useful because they can represent real and fake things in a way that can be cheaply manipulated and transported instantly across the world.  Fake things also have challenges.&lt;br /&gt;
&lt;br /&gt;
Software is a little unique even among fake things because in making software we are often making something that has never existed before.  When someone creates a stove there are hundreds of thousands of others stoves in existence to draw upon.  There are wood stoves, electric stoves, and gas stoves.  But when someone created a text editor, they created something that had never existed before.  Here is how Richard Gabriel describes it:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&quot;But, consider the first people to design and build a text editor. Before that, there was never a text editor. Changes to a manuscript were always made by retyping or retypesetting. How would people want to make textual changes? How would people want to navigate? Searching? - no one ever heard of that before. Systematic changes? Huh? By the way, there were no display terminals, so how do you even look at the manuscript?&quot; -- &lt;a href=&quot;http://dreamsongs.com/LessonsFromNothing.html&quot;&gt;http://dreamsongs.com/LessonsFromNothing.html&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
Web applications, virtual currencies, automated theorem provers, and many other software applications had never existed before or were so different in nature from their physical counterparts that they were a unique thing.  Making fake things is hard enough, but making things that have never existed before is that much harder.  That&#39;s not the end of it, though.&lt;br /&gt;
&lt;br /&gt;
Fake things have no real world to help co-design them.  Stoves have a real world to help co-design them.  There are accessories that are used with stoves that help co-design them.  Real things like pots and pans.  Stoves have to fit through doorways, nestle between kitchen cabinets, and match the colors on the walls.  Text editors have accessories like keyboards and mice that were invented to give real people made of meat a way of manipulating a conceptual world by proxy.  Perhaps a mouse has to be compatible with a human hand, but a text editor has to be compatible with the mental model of a text editor that exists in a human mind, a model which no one had ever thought of before.  Ultimately making software is a process of collaborating with other humans to dream up some mental model, and then making a fake thing out of software that other humans can use to manipulate that model (assuming they properly understand the mental model).&lt;br /&gt;
&lt;br /&gt;
Which reminds me, collaboration is also a fake thing.  Collaboration is about using real things, like vibrating air, to push around fake things, like words.  It is about using real things, like markers and whiteboards, to manipulate fake things, like ideas.  All of these real things can be replaced by fake things, like video conferencing software and text editors.  And fake things like words and ideas can be replaced by other fake things, and all of these fake things can be instantly transported, copied, and manipulated by real people in real (and very distant) places.  Collaboration is not a real thing, it is a fake thing produced through the interaction of real people thinking creatively.&lt;br /&gt;
&lt;br /&gt;
And making software is a creative act.  Writing software is writing instructions to make a computer do something.  You must choose the instructions, determine their order, name things.  You develop your own style.  Writing software is writing words that have effect.  Writing software is as close as you can get to God with words speaking reality into existence, the ultimate creative act.  But writing software is not just for telling computers what to do.  It is also collaboration with other humans.  They must read, understand, modify, and extend what you write.  They must understand your vision.  You must collaborate with them through your source code.&lt;br /&gt;
&lt;br /&gt;
So, here we are.  We have discovered that software is a fake thing, that it is often an entirely new thing, that it is a pure product of the mind, that it is born of collaboration, and it is creative expression.  Now what?  We must systematically question the constraints we place on ourselves, because those constraints are often meant for real things and our things are fake.  Here are a few examples:&lt;br /&gt;
&lt;br /&gt;
A top-down management hierarchy is for making real things, not fake things.  Top-down, command-and-control hierarchies are about control and efficiency.  Control and efficiency are important for real things, because real things have locality, cost, and scarcity.  Software has none of these things.  Control and efficiency are important when you are manufacturing the same thing over and over.  Software is often exploratory.  Software is valuable not because we repetitively make lots of little copies of the same thing, but because we dream up some new way of doing things that has never been done before.  Control and efficiency are important when you have a predictable process.  A creative process is not predictable.  You may think for hours about a problem, sleep on it, and then have the answer pop into your head the instant you wake up.  We need to think differently, not just about what we make, but how we make it.&lt;br /&gt;
&lt;br /&gt;
Offices are about locality.  An office puts materials, means of production, and managers in the same physical location.  Yet with software there is no material and the means of production are mental.  There is no reason to be concerned about locality.  Ostensibly having a bunch of people in the same office enables them to collaborate, but collaboration is a fake thing.  Collaboration does not exist in San Francisco or Saint Louis.  It does not weigh 1kg.  It is not blue.  Having an office for collaboration is a rationalization that projects the past onto the future.  Is collaboration different using video conferencing and Google Docs than it is using tables and chairs in an office?  Yes, because fake things are different than real things.  I do not recommend mixing fake things like video conferencing with real things like offices.  It may take getting used to, but embracing the fakeness of collaboration has advantages like hiring people where they want to live instead of trying to convince them to live where you live.  It also means having permanent, searchable, modifiable artifacts that can be shared instantly across the world, instead of a whiteboard in a room.&lt;br /&gt;
&lt;br /&gt;
Software can process data, but software is also data.  This creates leverage.  You can flip a bit, and that bit can flip ten others, and those ten another one hundred, etc.  Compilers, build tools, continuous integration, and automated tests are all software doing things to software.  &quot;The cloud&quot; has created a lot of leverage because it took something that was real (a machine) and made it fake (a &quot;cloud instance&quot;), and once it is fake it can be manipulated by software.  The higher you can climb the mountain of abstraction the more powerful you will become.  Before selling to Facebook, WhatsApp had ~450 million active users and ~55 employees.  Yahoo has ~12,500 employees.  I don&#39;t know how many active users they have, but let&#39;s just pretend it is ~450 million.  Don&#39;t be Yahoo.&lt;br /&gt;
&lt;br /&gt;
These are just examples, and you can agree or disagree.  My point is, we as an industry can achieve market success and realize our visions much more powerfully, but we must understand the nature of the software we are creating (it is fake), and the newness of what we are doing every day, and its collaborative nature, and the tools that we can take advantage of, and we must have the courage to give up on arbitrary constraints that are optimized for making real things.  We must pursue leverage, because leverage will enable us to do amazing things.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/2159484258107506594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/2159484258107506594' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/2159484258107506594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/2159484258107506594'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2016/03/making-fake-things.html' title='Making Fake Things'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-1702339269615713962</id><published>2014-05-30T14:20:00.000-04:00</published><updated>2014-05-30T14:20:00.566-04:00</updated><title type='text'>The following is a quote from an astronaut speaking about a spacecraft</title><content type='html'>&lt;blockquote&gt;&quot;There&#39;s so much more elbow room in there compared to the Soyuz,&quot; he said. &quot;Instead of just bringing two of your buddies, you can bring six ... It&#39;s got modern electronics, it&#39;s got modern materials in the heat shield. So technologically, it&#39;s a giant leap beyond the Soyuz.&quot;&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://spaceflightnow.com/news/n1405/29dragonv2/&quot;&gt;SpaceX reveals new-look passenger spacecraft&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;
One could think of a number of snarky comments that could be made (especially given that Elon Musk is also the CEO of Tesla), but I&#39;m kind of amazed that this is how human beings are speaking about spacecraft these days.  &lt;br /&gt;
&lt;br /&gt;
Perhaps it should all be taken with a grain of salt since this quote was spoken at a publicity event by someone who works for SpaceX.&lt;br /&gt;
&lt;br /&gt;
Still...how long until I can take a vacation to Mars?</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/1702339269615713962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/1702339269615713962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/1702339269615713962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/1702339269615713962'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2014/05/the-following-is-quote-from-astronaut.html' title='The following is a quote from an astronaut speaking about a spacecraft'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-5011590579306060266</id><published>2014-05-10T09:20:00.001-04:00</published><updated>2014-05-10T09:45:32.797-04:00</updated><title type='text'>This, But For Computer Programming</title><content type='html'>&lt;blockquote&gt;If you meet a philosopher on a train and ask him his profession, he is likely to lie. It is not that philosophers are especially prone to lying, but rather that philosophy is a peculiar profession. To tell your fellow passenger that you are a philosopher opens up an awkward line of questioning. ... If you take the plunge, however, and accept the label of philosopher, you must be prepared for the disappointment when your listener hears that you don&#39;t live in a hut on a mountaintop, haven&#39;t uncovered the secret of life, and cannot explain why the world exists. If you are foolish enough to go further and attempt to describe your lifelong attempt to reconcile the epistemology of mathematics with its ontology, be prepared to encounter a look in which boredom and horror are blended equally. Best, therefore, to say simply that you are an architect, and leave it at that.&lt;br /&gt;
&lt;br /&gt;
&amp;#8212; &lt;em&gt;A World Without Time&lt;/em&gt;, Palle Yourgrau, page 164.&lt;/blockquote&gt;&lt;br /&gt;
Some possible substitutions:&lt;br /&gt;
&lt;table style=&quot;border: 1px solid black&quot;&gt;&lt;tr&gt;&lt;td&gt;Philosopher&lt;/td&gt;&lt;td&gt;Computer Programmer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;he/him&lt;/td&gt;&lt;td&gt;she/her&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;live in a hut on a mountaintop&lt;/td&gt;&lt;td&gt;live in your parents basement&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;uncovered the secret of life&lt;/td&gt;&lt;td&gt;know why my computer is running so slowly&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;explain why the world exists&lt;/td&gt;&lt;td&gt;install the driver for my printer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;reconcile the epistemology of mathematics with its ontology&lt;/td&gt;&lt;td&gt;figure out the best cache invalidation strategy to provide a balance of performance and freshness&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;
As a corollary, I wonder if there is a t-shirt for philosophers that is congruent with the &quot;No, I will not fix your computer&quot; t-shirt for computer professionals, something like &quot;No, I will not fix your worldview.&quot;&lt;br /&gt;
</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/5011590579306060266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/5011590579306060266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5011590579306060266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5011590579306060266'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2014/05/this-but-for-computer-programming.html' title='This, But For Computer Programming'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-1078301971694294373</id><published>2014-01-14T06:49:00.000-05:00</published><updated>2014-01-14T06:49:30.291-05:00</updated><title type='text'>The Solution for Silicon Valley?</title><content type='html'>&lt;blockquote&gt;&quot;People&amp;#8212;especially in the financial community&amp;#8212;seem to assume that every industry works kind of like a web startup, and that all you need is two hot guys and $25,000 and you&#39;re a millionaire in six months.  Heavy semi doesn&#39;t work like that.  Heavy semi is like steel mills and railroads.  By the time you can get a serious semi company self sustaining you&#39;re looking at a couple hundred million dollars of investment.&quot; &amp;#8212; Ivan Godard of Out-of-the-Box Computing (&lt;a href=&quot;https://www.youtube.com/watch?v=uotQn-jrAZU#t=599&quot;&gt;https://www.youtube.com/watch?v=uotQn-jrAZU#t=599&lt;/a&gt;)&lt;/blockquote&gt;&lt;br /&gt;
It&#39;s a longer conversation to have, but I have opinions about Silicon Valley (&lt;a href=&quot;http://thenextweb.com/entrepreneur/2011/07/13/the-problem-with-silicon-valley-is-itself/#!r9ZqL&quot;&gt;that&lt;/a&gt; I &lt;a href=&quot;http://www.jwz.org/blog/2011/11/watch-a-vc-use-my-name-to-sell-a-con/&quot;&gt;share&lt;/a&gt; &lt;a href=&quot;http://www.ritholtz.com/blog/2013/05/startups-are-not-disruptive-they-the-global-rich-get-richer/&quot;&gt;with&lt;/a&gt; &lt;a href=&quot;http://allthingsd.com/20130521/bebo-founders-go-analog-with-exclusive-battery-club-in-san-francisco/&quot;&gt;others&lt;/a&gt;).  However, it is nice to see people trying to create a real business and solve real problems instead of creating the next &lt;a href=&quot;http://nonstartr.com/&quot;&gt;Instagram clone&lt;/a&gt;.  The thing is that it takes hard work, many years, and the perspective to step back and work towards fundamental&amp;#8212;not incremental&amp;#8212;change.&lt;br /&gt;
&lt;br /&gt;
Best of luck to the OOTBC guys!  True, a new CPU architecture isn&#39;t exactly solving problems of justice and social inequality, but at least it isn&#39;t a get rich quick scheme.  Finding ways to fill in computation at neglected price points in the market is a stepping stone to solving other problems.  Hopefully those problems aren&#39;t how to gamify haircuts or something.  *sigh*&lt;br /&gt;
&lt;br /&gt;
Let&#39;s have some get-rich-slow startups that are truly innovating to solve difficult, fundamental problems.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/1078301971694294373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/1078301971694294373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/1078301971694294373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/1078301971694294373'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2014/01/the-solution-for-silicon-valley.html' title='The Solution for Silicon Valley?'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-3445728657079642712</id><published>2014-01-08T06:19:00.001-05:00</published><updated>2014-01-08T06:19:46.755-05:00</updated><title type='text'>The Buck Stops Here</title><content type='html'>&quot;Rufer explains the thinking behind the process: &#39;I was signing checks one day and I recalled the saying, &quot;The buck stops here.&quot; I thought to myself, that isn&#39;t true. In front of me was a purchase order, a note that said the stuff had been shipped, we had received it, and that the price on the invoice matched the puchase order. A check had been prepared. Now, do I have the choice not to sign the check? Nope. So the question isn&#39;t where the buck stops, but where it starts&amp;#8212;and it starts with the person who needs the equipment.  I shouldn&#39;t have to review the purchase order, and the individual shouldn&#39;t have to get a manager&#39;s approval.&#39;&quot;&lt;br /&gt;
&lt;br /&gt;
&quot;First Let&#39;s Fire All the Managers,&quot; Gary Hamel (&lt;a href=&quot;https://archive.harvardbusiness.org/cla/web/pl/product.seam?c=573&amp;i=15715&amp;cs=7c855bfce2fd1c3860846954978b1181&quot;&gt;https://archive.harvardbusiness.org/cla/web/pl/product.seam?c=573&amp;i=15715&amp;cs=7c855bfce2fd1c3860846954978b1181&lt;/a&gt;)</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/3445728657079642712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/3445728657079642712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3445728657079642712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3445728657079642712'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2014/01/the-buck-stops-here.html' title='The Buck Stops Here'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-5735871563858966707</id><published>2013-12-30T11:03:00.000-05:00</published><updated>2018-07-08T16:54:25.787-04:00</updated><title type='text'>NixOS: A Field Report</title><content type='html'>&lt;h3&gt;Why?&lt;/h3&gt;NixOS is a relatively new Linux distribution based on the Nix package manager.  A Nix package is hashed based on its content, dependencies, compiler , etc. and stored immutably in the Nix store.  The Nix package manager uses this Nix store, a patched dynamic linker, and a buttload of symlinks to isolate installs.  You can have multiple versions of applications and libraries living on the same machine without conflict.&lt;br /&gt;
&lt;br /&gt;
The Nix package manager also maintains a history of installations and&amp;mdash;since the Nix store is full of immutable installs of applications and libraries&amp;mdash;Nix provides a way to rollback installs to a previously working configuration.  NixOS extends this concept all the way to the Linux kernel.  When you change the system configuration for your machine you get a new GRUB entry for that entire profile of your computer: kernel, applications, libraries, and even your configuration files.  If something goes badly you just reboot and select the GRUB entry for your previous configuration.  Check out section 1.4 of the NixOS manual for some cool details &lt;a href=&quot;http://nixos.org/nixos/manual/#sec-upgrading&quot;&gt;http://nixos.org/nixos/manual/#sec-upgrading&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
But wait there&#39;s more!  These installations are atomic, so it either completes successfully or not at all.  So basically what we get here is something like an ACID MVCC for the software on your computer.&lt;br /&gt;
&lt;br /&gt;
There are definitely practical benefits to all this.  There have been times that I&#39;ve done some riskier upgrades.  Moving to a new Ubuntu release is one of those times.  There&#39;s always a bit of a question as to what may or may not be broken.  I usually back up my files and do a fresh install.  I&#39;ve also been bitten a couple of times by a bad video driver upgrade that was annoying to recover from.  That said, I don&#39;t know that I&#39;ve really needed an ACID MVCC for software all that often.&lt;br /&gt;
&lt;br /&gt;
Aside from riskier installs you can also setup a Nix configuration for each project you work on.  You can chroot into this Nix environment.  The Nix configuration can be version controlled, so that when you checkout an old branch you can use the environment that matches that version of your project.  You can also take this Nix configuration and create a VM from it, or send it off to an EC2 node.  Admittedly you can do all of this stuff just using the Nix package manager on Linux or OSX without needing NixOS.  (Here is how &lt;a href=&quot;http://zef.me/5966/setting-up-development-environments-with-nix&quot;&gt;http://zef.me/5966/setting-up-development-environments-with-nix&lt;/a&gt;.)&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;So, really...Why?&lt;/h3&gt;So all this stuff is great, but maybe not worth switching to NixOS for your day-to-day desktop machine.  I have moved for a couple of reasons.  Lately I&#39;ve been getting disillusioned with the direction Ubuntu is headed.  I barely made it through the last LTS upgrade.  I prefer to use Gnome and XMonad, but Ubuntu comes with Unity these days and it&#39;s hard to get a plain Gnome install (though I made it work).  The flip side is that Ubuntu is a really smooth install where most everything just works out of the box, but that&#39;s not really enough to keep me there.  I&#39;m basically forced to consider some kind of a major change whether it is a change in distribution or the tools I use or something.&lt;br /&gt;
&lt;br /&gt;
I also like to try to change things up every once in a while.  I&#39;ve been on Ubuntu for close to 10 years and Gnome+XMonad for maybe 3 years.  I need to shake things up a bit, learn some new stuff, and feel like a hopeless newb.  Boy did I ever accomplish that!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Attempt 1: No Gnome &amp; Miserable Failure with Wireless&lt;/h3&gt;I downloaded and burned the NixOS 13.10 minimal CD.  It booted up fine and gives you hints to walk you through the process.  The CD boots with a copy of the manual on one of the Linux consoles so you can jump back and forth to reference the manual as you&#39;re installing.  The process is pretty simple, too.  You format a partition, mount it, run a config generation program, and customize the generated config.  Once the config is set you run an install command and boot into your new NixOS installation.&lt;br /&gt;
&lt;br /&gt;
However, Gnome doesn&#39;t install.  Based on a reading of the docs you might be led to think that it does, but after 13.10 was released this commit was made to the Nix packages: &lt;a href=&quot;https://github.com/NixOS/nixpkgs/commit/a734f32fa1efce21a008e391cfb10695c4d738cd&quot;&gt;https://github.com/NixOS/nixpkgs/commit/a734f32fa1efce21a008e391cfb10695c4d738cd&lt;/a&gt;, so it&#39;s not even an option in more recent versions of NixOS.&lt;br /&gt;
&lt;br /&gt;
Coincidentally XMonad doesn&#39;t install either.  Well it seems like it does, and if you use it without any custom config then it&#39;s probably fine, but to use a custom config you need a Haskell compiler and the XMonad packages.  For some reason when the XMonad packages install they don&#39;t install the dependencies that they need (which seems broken given how Nix is supposed to work).  I had to iteratively run `ghc-pkg check` and install a bunch of packages manually.  Perhaps I was missing something.  Also, not to give away the ending, but this was with 13.10, so it may be a different story with the latest unstable NixOS.&lt;br /&gt;
&lt;br /&gt;
Finally, I had wireless issues.  The installation CD booted and I was able to get an install, but once I tried to find some combination of CLI and/or GUI software to configure my wireless adapter I wedged something, and decided to just reboot and reinstall, but the installation CD was hanging when starting the WPA supplicant.  It seemed maybe there was some state stored in the wireless card that was causing the WPA supplicant to hang, but I couldn&#39;t boot NixOS in order to configure the card.  After many hours fiddling with this to try to get the wireless working and being very frustrated I very nearly gave up on NixOS.  As a last ditch effort I decided to try using the unstable version of NixOS.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Attempt 2: Using Unstable NixOS&lt;/h3&gt;Out of the gate Unstable NixOS was more stable than the 13.10 release.  I was able to actually boot the thing!  I made it through the installation process.  I had decided that I was going to use Xfce+i3 instead of Gnome+XMonad.  Changing my desktop and window manager at the same time as changing my distribution was going to make this whole process more &quot;interesting.&quot;&lt;br /&gt;
&lt;br /&gt;
Configuring NixOS is relatively simple once you know what the configuration options are, but finding them isn&#39;t as easy as it could probably be.  The NixOS manual has a section of configuration options at the end.  That was an important reference.  I don&#39;t know if it documents every possible option, so sometimes I would take a look at the Nix package source.  There are also configuration options that affect some packages that aren&#39;t entirely obvious unless you look at the package source.  I think in the future it would be nice (in addition to the way the documentation is currently organized) to have documentation that can be browsed per package, so you could see for a particular package what options affect it.&lt;br /&gt;
&lt;br /&gt;
Having a working distribution is since, but there were still some annoyances.  Searching for packages is also a bit unsatisfying.  The recommended way to search seems to be `nix-env -qaP &#39;*&#39; | grep NEEDLE` which works, but it&#39;s not the most performant, and you also can only search by package name; you can&#39;t search by description or configuration options or anything else.  Even when you&#39;ve found the package you want more detail on, it is not obvious how to find the package.  You can browse the nixpkgs source, but it is organized by categories.  The best way seems to be doing a `find / -name NEEDLE` or something.  None of this is really a deal breaker (for me), but just lessons learned on how to find information.&lt;br /&gt;
&lt;br /&gt;
Finally, on the subject of finding information the nix-dev mailing list is a good resource.  I ended up searching it with google &quot;site:http://lists.science.uu.nl/pipermail/nix-dev/ NEEDLE&quot;.  I guess it is also possible to search the Gmane archive &lt;a href=&quot;http://news.gmane.org/gmane.linux.distributions.nixos&quot;&gt;http://news.gmane.org/gmane.linux.distributions.nixos&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Adaptations&lt;/h3&gt;There were definitely tools that I&#39;m used to using that were available and worked great on NixOS, among them were Conkeror, Emacs, OpenJDK, Ruby, Tmux, and Skype.&lt;br /&gt;
&lt;br /&gt;
There were replacements I had to make.  Obviously Gnome+XMonad became Xfce+i3, and this had a cascading effect.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I had a raise-or-run script that used wmctrl to activate a program&#39;s window, but wmctrl doesn&#39;t work with i3, so I had to replace that script with one that uses i3msg.&lt;/li&gt;
&lt;li&gt;I spent a bit of time tuning my i3 config to have bindings similar to the ones I was using with XMonad.&lt;/li&gt;
&lt;li&gt;Previously I was using gnome-panel for workspaces, wireless control, sound volume control, date/time, etc.; that got replaced by i3bar and i3status.&lt;/li&gt;
&lt;li&gt;I was using swarp to shuffle the mouse cursor out of the way in Gnome+XMonad, and that package wasn&#39;t available on NixOS, so I replaced that functionality with xdotool.&lt;/li&gt;
&lt;li&gt;I tried to get NetworkManager up and running, and there appear to be configuration options to get it set it up on NixOS, but I ran into issues.  I ended up just installing the wpa_gui tool to manage my wireless connections.&lt;/li&gt;
&lt;/ul&gt;I also had a cache of scripts that I used for various things.  Some of them were for building programs from source, but I think I can drop those and just use Nix to accomplish the same thing.  Others I had to replace &#39;#!/bin/bash&#39; with &#39;#!/usr/bin/env bash&#39; since NixOS doesn&#39;t have things at fixed, standard locations like other Linux distributions.&lt;br /&gt;
&lt;br /&gt;
There are some other minor issues to work out.  For one my sound card seems to be detected just fine, and Skype will use it, but Xfce doesn&#39;t seem to be playing any sounds.  I just get a system beep for &quot;sound&quot; events.  I think this is an issue with the configuration of Xfce and its sound theme or something.  Not really a major issue for me, but I&#39;d like to figure it out eventually.&lt;br /&gt;
&lt;br /&gt;
I would also like to get Dropbox installed.  It actually worked fine on 13.10, but for some reason it isn&#39;t working so well on unstable.  I haven&#39;t had a lot of time to look into it, and again not a high priority.  I may take the opportunity to look into OwnCloud instead.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;I went into this expecting it to be rough at times, and expecting to make some changes to the tools I was used to using.  That was no surprise.  I was a bit disappointed in how the latest official release of NixOS turned out.  The flip side is that the Unstable release has worked great so far, and I&#39;m a little more comfortable following the bleeding edge of NixOS given that (theoretically) I should be able to rollback any changes that bork my system.  I&#39;m hoping that turns out to be true.&lt;br /&gt;
&lt;br /&gt;
If you&#39;re willing to learn something new and possibly snag your sweater on some rough edges, then NixOS could be a fun experience for you. :)  If you use some of the same tools as me, then hopefully what I&#39;ve discovered can help you move to NixOS.  If you want something a little more polished, then you may want to wait on NixOS.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;References&lt;/h3&gt;My configuration.nix&lt;br /&gt;
&lt;a href=&quot;https://gist.github.com/pjstadig/8183688&quot;&gt;https://gist.github.com/pjstadig/8183688&lt;/a&gt;&lt;br /&gt;
Dotfile changes moving from Ubuntu+Gnome+XMonad to NixOS+Xfce+i3&lt;br /&gt;
&lt;a href=&quot;https://github.com/pjstadig/new.dotfiles/compare/455374...master&quot;&gt;https://github.com/pjstadig/new.dotfiles/compare/455374...master&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/5735871563858966707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/5735871563858966707' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5735871563858966707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5735871563858966707'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2013/12/nixos-field-report.html' title='NixOS: A Field Report'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-7360259082539744593</id><published>2013-12-22T09:10:00.001-05:00</published><updated>2013-12-22T09:10:52.946-05:00</updated><title type='text'>A Proof of the Braininess of &quot;The Simpsons&quot; and &quot;Futurama&quot;</title><content type='html'>&lt;blockquote&gt;Occasionally the mathematics does wind more deeply into the story, most notably in the 2010 “Futurama” episode “The Prisoner of Benda.” The plot turns on a device called the Mind-Switcher, which performs just the function its name suggests; over the course of the episode, as the apparatus is used with greater and greater abandon, the minds of the characters shuttle from body to body like singles switching bedrooms in a French farce. By the end, not a single consciousness remains in its proper skull. What’s worse, the characters can’t just retrace their steps to reunite each mind with its original body; the Mind-Switcher, having operated on a pair of minds, isn’t allowed to switch the same two minds again.&lt;br /&gt;
&lt;br /&gt;
Ken Keeler, who wrote the episode, realized that in order to get everything sorted out it might be necessary to introduce new characters, whose bodies could be used as waystations through which the minds could find their way home. An ordinary writer would have been content simply to find a way out of the episode. But Keeler became obsessed with the problem in its full generality, finally composing a proof that, no matter how wild the original fiesta of Mind-Switching, the damage can always be repaired once two new people are added to the system. This question may sound abstruse, but the part of math it belongs to — “combinatorial group theory” — is one of the hottest things going at the moment, with major advances popping up everywhere from Paris to Los Angeles. Keeler’s theorem isn’t one of those big advances, but it’s a real theorem, certainly the deepest piece of mathematics ever featured in a prime-time sitcom.&lt;/blockquote&gt;&lt;br /&gt;
-- Jordan Ellenberg, &quot;Mathematics and Homer Simpson&quot; (&lt;a href=&quot;http://www.washingtonpost.com/opinions/2013/12/20/ef1bfaa6-5b9a-11e3-bf7e-f567ee61ae21_print.html&quot;&gt;http://www.washingtonpost.com/opinions/2013/12/20/ef1bfaa6-5b9a-11e3-bf7e-f567ee61ae21_print.html&lt;/a&gt;)</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/7360259082539744593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/7360259082539744593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/7360259082539744593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/7360259082539744593'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2013/12/a-proof-of-braininess-of-simpsons-and.html' title='A Proof of the Braininess of &quot;The Simpsons&quot; and &quot;Futurama&quot;'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-3030794340083272115</id><published>2013-12-16T06:09:00.000-05:00</published><updated>2013-12-16T06:09:40.243-05:00</updated><title type='text'>The Notion of &quot;Real-Time&quot;</title><content type='html'>&quot;I think the current evolution of technical language around web developers has made real-time mean: &#39;consume information as soon as it is available&#39; and not &#39;_react to the information in a timely manner or this car will crash_&#39;.&quot;&lt;br /&gt;
&lt;br /&gt;
-- Alvaro Videla, &quot;Tell me more about your real-time systems&quot; (&lt;a href=&quot;http://videlalvaro.github.io/2013/12/tell-me-more-about-realtime.html&quot;&gt;http://videlalvaro.github.io/2013/12/tell-me-more-about-realtime.html&lt;/a&gt;)</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/3030794340083272115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/3030794340083272115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3030794340083272115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/3030794340083272115'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2013/12/the-notion-of-real-time.html' title='The Notion of &quot;Real-Time&quot;'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-5404753178380171766</id><published>2013-07-31T08:46:00.001-04:00</published><updated>2013-08-13T07:46:33.388-04:00</updated><title type='text'>Remote != Distributed</title><content type='html'>In an age when companies seem to be shutting down their remote work programs, I&#39;m here to tell you that a distributed team can work, and when it works well it is a great experience.  I have worked on a distributed team for the past three years.  Prior to that I worked for four years in an office that had one full-time remote employee and allowed occasional work from home for others.&lt;br /&gt;
&lt;br /&gt;
Working from home and working remotely are not the same thing as working on a distributed team.  If there is a center of gravity at an office and a few remote employees orbit that office, then there is a different experience for some people than for others, and there is a different way of working for some people than for others.  There is a natural imbalance that an inanimate system would want to equalize, but in a human organization people pull in opposite directions.&lt;br /&gt;
&lt;br /&gt;
A distributed team is a team where no one is physically co-located.  There is no center of gravity at an office.  There is no imbalance, because everyone has the same experience, and everyone has the same way of working.&lt;br /&gt;
&lt;br /&gt;
When there is an office/remote split, there is a different experience for some than for others.  The office people have shared experiences like water cooler chat and birthday celebrations, and the remote people are left out.  The office people gather in a conference room for a meeting and dial in the remote people over a crappy speakerphone.  The experiences are different which affects morale and cohesion.&lt;br /&gt;
&lt;br /&gt;
On a distributed team everyone has the same experience.  You find new ways to create shared experiences that are different from office experiences and unique to distributed teams.  You use tools that allow meetings to be high quality experiences for everyone.  These shared experiences support morale and cohesion.&lt;br /&gt;
&lt;br /&gt;
An office/remote split means different ways of working for different people.  In-office employees may depend on ad hoc hallway conversations, but remote employees are not privy to those.  In-office employees have an &quot;out of sight, out of mind&quot; mentality and think that remote employees aren&#39;t productive because they aren&#39;t communicating with the remote employees.  Remote employees feel disconnected and lack direction for the same reasons.&lt;br /&gt;
&lt;br /&gt;
On a distributed team everyone communicates through the same channels, and everyone can see the activity about who is doing what.  Since there aren&#39;t two different communication channels there isn&#39;t an &quot;out of sight, out of mind&quot; problem.&lt;br /&gt;
&lt;br /&gt;
When there are different experiences, different ways of working, different communication channels at the same company, then two different cultures develop, and that is detrimental.  A permanent office/remote split is doomed to failure from the beginning, so it&#39;s no wonder that companies are killing their remote work programs.&lt;br /&gt;
&lt;br /&gt;
What does it look like to do a distributed team right?  I can tell you what has worked for me and my company.  I do not expect that our experiences are universal, but I will try to draw some general principles.&lt;br /&gt;
&lt;br /&gt;
Distributed teams that work well:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Use tools to fix work into a tangible medium of expression (to borrow from copyright law).&lt;/strong&gt;  Office collaboration via ad hoc hallway conversations and whiteboards doesn&#39;t work for distributed teams.  You have to produce Google Docs, tickets in Jira, etc.  These are things to which everyone can have access.  Frankly, distributed or not, this is a better way of working than informal ideas banging around in people&#39;s heads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communicate through many-to-many channels.&lt;/strong&gt;  Of course there is still a need for one-to-one communication, but using many-to-many communication channels means that everyone can feel a part of the company.  Just like others can walk by and join in on hallway conversations, people can observe and contribute to Skype calls and chat rooms.  It is also a good idea to have logs of these chats that people can catch up on (see above).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Adopt processes that encourage collaboration and productivity.&lt;/strong&gt;  Working on a distributed team may not be for everyone; to a certain extent it does take a self-motivated individual.  However, pair programming and daily standups create an environment that encourages collaboration and accountability.  We also tend to hire people mostly in North and South America so that the timezones line up better for collaboration.  We also meet face-to-face 3-4 times a year, which helps to develop the personal relationships that are necessary to working well together.&lt;/li&gt;
&lt;/ul&gt;Realize that the idea of &quot;remote&quot; working does not work when combined with an office culture and a center of gravity in one location.  Working from home or remotely may work temporarily, but eventually gravity will pull you back towards the office.  If you try to maintain this unnatural office/remote balance you will enforce different experiences and methods of work and create two different cultures in your company.  This cultural divide will lead to jealousy, resentment and other morale and cohesion problems.&lt;br /&gt;
&lt;br /&gt;
This does not mean that it is impossible to function unless everyone reports to the same office.  It just means that different tools and processes must be developed to facilitate a distributed team.  You must use tools and processes that encourage tangible expression of ideas, many-to-many communication, and collaboration and productivity.&lt;br /&gt;
&lt;br /&gt;
Remote working is isolating and doomed to failure, but a distributed team done right is a joy.</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/5404753178380171766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/5404753178380171766' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5404753178380171766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5404753178380171766'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2013/07/remote-distributed.html' title='Remote != Distributed'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8086052983184217440.post-5311422863036373506</id><published>2012-11-28T09:00:00.001-05:00</published><updated>2012-11-28T09:01:15.664-05:00</updated><title type='text'>Evaluating CLEAR Wireless Internet</title><content type='html'>&lt;p&gt;Here&#39;s my current situation: I have Cox High Speed Internet at home in Fairfax County, Virginia, and I have a Verizon Wireless smart phone with the HotSpot feature enabled. I&#39;ve been intrigued by Clearwire for a while, and I&#39;m always on the hunt for improving my Internet access at home and on the road. Though I&#39;ve been fairly happy with HotSpot access through Verizon (though not so happy with my HTC Rezound, but that&#39;s a story for another time), Clear has a 15-day money back guarantee, and no contract, so it seemed like a no brainer to try them out. Also, I checked their coverage and I should get a good signal at my house. &lt;/p&gt;

&lt;p&gt;
I think in an ideal world I&#39;d like to decouple my smart phone and my mobile Internet. I&#39;d like to have a smart phone with minutes and texting, and connect it to the Internet (as well as other devices) through a mobile HotSpot, like Clear. However, it doesn&#39;t look like that plan is going to come to fruition any time soon. For one thing, Verizon won&#39;t allow me to have a smart phone on their network without some kind of data plan. &lt;/p&gt;

&lt;h3&gt;How does Clear stack up?&lt;/h3&gt;

&lt;p&gt;The experience signing up for and using Clear has been really great. (I&#39;ll let you know how it goes returning the device and getting my money back...but I&#39;m getting ahead of myself.)&lt;/p&gt;

&lt;p&gt;
I signed up on their website, and received the device the next day. I plugged in the device and it connected to the 4G network. I was able to connect my computer to the HotSpot device without any problems at all.&lt;/p&gt;

&lt;p&gt;
I tested the &quot;4G Internet Basic&quot; plan which has an advertized speed of 1.5Mbps down and 500Kbps up for $34.99 per month. According to speedtest.net I was getting 1.92Mbps down and 460Kbps up with a ping of 72ms.&lt;/p&gt;

&lt;p&gt;
It looks like you get what you pay for, and the experience is very smooth, but for me the price/speed isn&#39;t as good as I can get elsewhere. The HotSpot on my smart phone gives me 9.93Mbps down and 3.21Mbps up with a ping of 58ms for $30 on top of my unlimited data plan. (I&#39;m grandfathered in on the Verizon plan I&#39;m on. I&#39;m not sure what the numbers would look like if I were to sign up today.) And my Cox High Speed Internet gives me 39.48Mbps down and 12.33Mbps up with a ping of 18ms for $40 per month.&lt;/p&gt;

&lt;p&gt;
Clear has a &quot;4G Internet Plan&quot; which has an advertized speed of 6Mbps down and 1Mbps up for $49.99 per month, but that is getting on the steep side for me, and the analysis doesn&#39;t help Clear.  &lt;/p&gt;

&lt;p&gt;
Comparing my options, $1 will purchase 1Mbps from Cox, 0.333Mbps from Verizon, 0.059Mbps from the 1.5Mbps Clear plan, and 0.122Mbps from the 6Mbps Clear plan.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I would really like to use a service like Clear, and I have no complaints about the Clear experience. However, it is not the best value for me. If Clear was charging $6 per month for their 6Mbps plan, I&#39;d be all over it, maybe even if they charged $10 per month for their 6Mbps plan. However, as it is, I&#39;m going to pass.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://paul.stadig.name/feeds/5311422863036373506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/8086052983184217440/5311422863036373506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5311422863036373506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8086052983184217440/posts/default/5311422863036373506'/><link rel='alternate' type='text/html' href='http://paul.stadig.name/2012/11/evaluating-clear-wireless-internet.html' title='Evaluating CLEAR Wireless Internet'/><author><name>Paul Stadig</name><uri>http://www.blogger.com/profile/04475151533455732056</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>