<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HCoder.org &#187; software</title>
	<atom:link href="http://hcoder.org/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://hcoder.org</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sat, 04 Feb 2012 11:06:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>My short experience with GNOME 3</title>
		<link>http://hcoder.org/2011/10/18/my-short-experience-with-gnome-3/</link>
		<comments>http://hcoder.org/2011/10/18/my-short-experience-with-gnome-3/#comments</comments>
		<pubDate>Tue, 18 Oct 2011 17:11:21 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[desktop]]></category>
		<category><![CDATA[gnome]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1200</guid>
		<description><![CDATA[After not having blogged about anything but book summaries lately, I thought it was about time to write something else :-) EDIT: Added the last point, the most important one! I had been thinking of trying out GNOME 3 since it was released. For a number of reasons, I only managed to give it a try [...]]]></description>
			<content:encoded><![CDATA[<p>After not having blogged about anything but book summaries lately, I thought it was about time to write something else :-) <strong>EDIT:</strong> Added the last point, the most important one!</p>
<p>I had been thinking of trying out GNOME 3 since it was released. For a number of reasons, I only managed to give it a try a couple of days ago. I normally use KDE 4, but wanted to see how GNOME was doing these days, and wanted to see if it was something I could maybe switch to. I have to say I quite liked some of the stuff I saw, but I don&#8217;t think I can switch. My reasons:</p>
<ul>
<li>Language switcher keyboard combination: I just couldn&#8217;t find any combination I could use. Everything conflicted with some other combination I use (esp. in Emacs). Having to change the keymap by clicking on the top bar didn&#8217;t sound sane to me.</li>
<li>Order of the OK/Cancel buttons: even if I switched, I would probably use a combination of systems. Having to train my brain to look for the buttons in a different position seemed like too much.</li>
<li>Rhythmbox seemed plain, clunky and hard to use. It seemed hard for me to do what I wanted, plus it crashed consistently while trying to listen to some podcast.</li>
<li>I kind of like the idea of how workspaces work (even though I have to radically change the way I use them to adapt to them), but for me it&#8217;s too much that both (a) closing the last window makes the workspace disappear and (b) you can&#8217;t create workspaces &#8220;above&#8221;. That is a deal-breaker for me.</li>
<li>Can&#8217;t create workspaces on the right or left? I could get used to that probably, but it added up to my frustrations with GNOME 3 workspaces.</li>
<li>Constant repainting issues.</li>
<li>Can&#8217;t make sense of the window traversing. Let&#8217;s say I have two virtual desktops, one with a browser and another one with two terminals. The focus is on one of the terminals, and I want to go to the other terminal (with the keyboard, of course). If I just press Ctrl-Tab GNOME takes me to the web browser in the other desktop! If I want to go to the other terminal, I have to press Ctrl-Tab, Shift-Ctrl-Tab to go back to the terminal, arrow down to see all the terminal windows, arrow right to go to the next terminal. It&#8217;s even worse when I have Opera in one virtual desktop (maximised) with the error console in the same desktop. As Opera is maximised, I can&#8217;t even click with the mouse, so the only way to switch to the error console I can think of is doing the dance described above. Am I missing something, is this for real? <em><strong>EDIT:</strong> I was told about Ctrl-` (changes between windows of the same application). Cute attempt, but I don&#8217;t think I can get used to thinking if I have to use Ctrl-TAB or Ctrl-`. So that remains &#8220;impossible to use&#8221; for me.</em></li>
</ul>
<p>I wonder if some GNOME user can shed light on some of those issues, although it doesn&#8217;t seem like I can find a solution for all my frustrations :-)</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1200&amp;md5=2b689ff07a471e40a46cc5620c4e82ce" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/10/18/my-short-experience-with-gnome-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=1200&amp;md5=2b689ff07a471e40a46cc5620c4e82ce" type="text/html" />
	</item>
		<item>
		<title>Book summary: Pragmatic Thinking &amp; Learning (III)</title>
		<link>http://hcoder.org/2011/10/12/book-summary-pragmatic-thinking-learning-iii/</link>
		<comments>http://hcoder.org/2011/10/12/book-summary-pragmatic-thinking-learning-iii/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 23:38:09 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Book summaries]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[brain]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1192</guid>
		<description><![CDATA[This is the third and last part of my summary of Pragmatic Thinking &#38; Learning, by Andy Hunt. See parts one and two on this same blog. This part will cover chapters &#8220;Gain experience&#8221;, &#8220;Manage Focus&#8221; and &#8220;Beyond Expertise&#8221;. Gain experience Your brain is made to learn by exploring and building mental models on your [...]]]></description>
			<content:encoded><![CDATA[<p>This is the third and last part of my summary of Pragmatic Thinking &amp; Learning, by Andy Hunt. See parts <a href="http://hcoder.org/2011/10/10/book-summary-pragmatic-thinking-learning/">one </a>and <a href="http://hcoder.org/2011/10/11/book-summary-pragmatic-thinking-learning-ii/">two</a> on this same blog. This part will cover chapters &#8220;Gain experience&#8221;, &#8220;Manage Focus&#8221; and &#8220;Beyond Expertise&#8221;.</p>
<h2>Gain experience</h2>
<p>Your brain is made to learn by exploring and building mental models on your own, not by receiving information passively (see amazing footage of tennis teacher in Alan Kay&#8217;s <a href="http://video.google.com/videoplay?docid=-533537336174204822">Doing with Images Makes Symbols</a>, starting on 55:30). In real life there&#8217;s no curriculum, you&#8217;ll make mistakes and it will get messy: the kind of feedback you need. We learn by &#8220;playing&#8221;, but that doesn&#8217;t mean easy or non-business-like. <a href="http://en.wikipedia.org/wiki/Seymour_Papert">Papert</a> students called it &#8220;fun&#8221; <em>because</em> it was hard, not <em>in spite of</em>.</p>
<p>Leveraging existing knowledge helps learning new skills: we can often find similarities, literal or metaphorical, with existing skills. However, careful not to <em>stick</em> with the similarity. Fully embrace the new skill&#8217;s unique characteristics.</p>
<p>Failures are valuable because they can lead to study and understand what went wrong and how to fix it. They are critical to success, but only when well-managed. A good environment for good failures needs freedom to experiment (few problems have a single solution; prototype more than one solution to a problem), ability to backtrack to a stable state, reproduce any work product as of any time (source control, and the ability to run those versions of the program), ability to demonstrate progress (get comparable feedback between versions). Version control, unit testing and automation give this environment. A supporting environment can make or break learning for anyone.</p>
<p>Tip: to raise awareness when some code fails without apparent reason, try to imagine what the code should look like, then compare it to the real thing.</p>
<p>Time pressure actively shuts things down. Your vision narrows, and R-mode doesn&#8217;t get the chance to work at all.</p>
<h2>Manage Focus</h2>
<p>When not doing anything, the L-mode will produce incessant mental chatter, which interferes with R-mode processing. Meditation helps controlling the L-mode &#8220;monkey voice&#8221;.</p>
<p>When meditating you don&#8217;t want trance, falling asleep, or &#8220;contemplate the big mystery&#8221;, but to sink into a relaxed awareness of yourself and your environment without judgement or making responses. Meditation exercise suggestion: find a quiet spot; sit in a comfortable, alert position with a straight back (become aware of any tension and fix it); close you eyes and focus your awareness on your breath; be aware of the rhythm (don&#8217;t try to change it, just be aware); keep your mind focused on your breath (do not use words or start a conversation with yourself); when you start thinking about some topic or having a conversation with yourself, let the thoughts go and get the focus back on the breath. Even if you mind is wandering often, the exercise of bringing yourself back is useful.</p>
<p>You have to let your thoughts &#8220;marinate&#8221; to get the best results. Different people have different methods to marinate (sitting around doing nothing, humming, eating a crunchy snack, making paper dolls&#8230;). Thinking about at least three solutions to a problem gives you the confidence that you have thought &#8220;enough&#8221; about it. Then, you can let those ideas marinate and come up with the best solution.</p>
<p>Assorted tips:</p>
<ul>
<li>Develop your exocortex (mental memory or processing outside your physical brain: book collection, notes, favourite IDE, etc).</li>
<li>Deliberate switching to e-mail/IM. Close what you&#8217;re working on, take a deep breath, then switch.</li>
<li>Have a way to note things quickly when they come up, without losing the flow or what you were doing (wiki/scratchpad inside you IDE or whatever).</li>
<li>When stuck or bored, doodle on a piece of paper, or go for a walk (without talking to anyone). That helps against checking the internet or e-mail.</li>
<li>Don&#8217;t answer IM right away, put up a sign (&#8220;don&#8217;t disturb&#8221;) during a debugging session or similar, or close the door if you have one. When you do get interrupted, try to save your mental state before you lose it.</li>
<li>Get two monitors (same size and brand) to keep the whole context at sight. Organise virtual desktops by task (communications/distractions, writing, coding/checking documentation, surfing), not by kind of application (browsers, editors, terminals).</li>
</ul>
<p>In summary: learn to quiet your chattering L-mode, deliberately work with and add to thoughts in progress, and be aware of how expensive context switching can be.</p>
<h2>Beyond Expertise</h2>
<p>Change is harder than it looks, old habits don&#8217;t go away easily. Don&#8217;t be hard on yourself, just correct it and go back to the right path. Suggestions to make effective change:</p>
<ul>
<li><em>Start with a plan</em>. Keep track of what you have accomplished, it&#8217;s probably more than you think.</li>
<li><em>Inaction is the enemy, not error</em>. The danger is not doing things <em>wrong</em>, is not doing anything.</li>
<li><em>New habits take time</em>. Expect at least three weeks, maybe more.</li>
<li><em>Belief is real</em>. If you think you&#8217;ll fail, you will.</li>
<li><em>Take small, next steps</em>. Keep your big goal in mind, but don&#8217;t try to spell out all steps you need to get there.</li>
</ul>
<p>Possible first steps (complete list on p. 247-248, this is just two highlights): (1) pick two things that&#8217;ll help you maintain context and avoid interruption, do them right away; (2) open your mind to aesthetics and additional sensory information (your cubicle, desktop, code: how &#8220;pleasing&#8221; is it?).</p>
<p>You don&#8217;t want to become a &#8220;niche expert&#8221;: approach learning without preconceived notions, prior judgement or a fixed viewpoint; be aware of your own reaction to new technology and ideas; be aware of yourself and the context. The biggest reason any of us fail is the autopilot.</p>
<p>And this is the end. I hope you liked it.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1192&amp;md5=b4e15f8d8f4ecb83aed5a7e1f804de05" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/10/12/book-summary-pragmatic-thinking-learning-iii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=1192&amp;md5=b4e15f8d8f4ecb83aed5a7e1f804de05" type="text/html" />
	</item>
		<item>
		<title>Book summary: Pragmatic Thinking &amp; Learning (II)</title>
		<link>http://hcoder.org/2011/10/11/book-summary-pragmatic-thinking-learning-ii/</link>
		<comments>http://hcoder.org/2011/10/11/book-summary-pragmatic-thinking-learning-ii/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 22:36:54 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Book summaries]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[brain]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1185</guid>
		<description><![CDATA[This is the second part of my summary of Andy Hunt&#8217;s &#8220;Pragmatic Thinking &#38; Learning&#8221;. See the first part on this blog. This part will cover chapters ”Get in Your Right Mind”, “Debug Your Mind” and &#8221;Learn Deliberately&#8221;. Get in Your Right Mind A good way to involve your brain more is to use more [...]]]></description>
			<content:encoded><![CDATA[<p>This is the second part of my summary of Andy Hunt&#8217;s &#8220;Pragmatic Thinking &amp; Learning&#8221;. See the <a href="http://hcoder.org/2011/10/10/book-summary-pragmatic-thinking-learning/">first part</a> on this blog. This part will cover chapters ”Get in Your Right Mind”, “Debug Your Mind” and &#8221;Learn Deliberately&#8221;.</p>
<h2>Get in Your Right Mind</h2>
<p>A good way to involve your brain more is to use more senses than usual. For tactile you can use building blocks like Lego, CRC cards, etc. Example of &#8220;role-playing&#8221; a software design on p. 77. The advantage of using the R-mode is not that it&#8217;s a panacea, it&#8217;s simply to use the other half of your brain <em>too</em> (reference to pair programming). Story of the climbing teacher on p. 81: the importance of feeling something first (R-mode) before learning it&#8217;s theory (L-mode), because it gives you the context to understand the theory and explanations better. Learning can be impeded by trying to memorise facts when you don&#8217;t grasp the whole yet. When creating, be comfortable with the absurd and impractical; when learning, get &#8220;used to it&#8221; before learning and memorising. Using metaphors can open up creativity because they communicate the R-mode and the L-mode (<a href="http://wordnet.princeton.edu/">wordnet</a> can help when creating metaphors).</p>
<p>Tip: the &#8220;morning pages&#8221; technique (p. 98). Write them first thing in the morning (before coffee, shower or anything else); write at least three pages by hand, without computer; do not censor what you write; do not skip a day. Blogging is also a good exercise (what you think about a topic, what you can defend publicly).</p>
<p>Tip: learn martial arts or yoga to improve concentration (p. 103). Tip: break small, daily routines (turn off the autopilot).</p>
<p>Forcing the brain to reconcile unlike patterns broadens the scope of material under consideration (see Zen koans and Greek oracles on p. 107). Reference to <a href="http://rtqe.net/ObliqueStrategies/">oblique strategies</a> (has electronic versions, including an <a href="https://market.android.com/details?id=org.multiply.strategies.oblique">Android version</a>!).</p>
<h2>Debug Your Mind</h2>
<p>We make decisions and solve problems based on faulty memory and our emotional state of the time, ignoring crucial facts, etc. <em>Some</em> cognitive biases: anchoring (ref: experiment with numbers and prices in predictably irrational), fundamental attribution error (other people behave based on their personality, we have excuses for our own behaviour; in reality, behaviour is often caused by the context), self-serving bias (&#8220;it&#8217;s my success&#8221;, but &#8220;it&#8217;s not my failure&#8221;; you&#8217;re always part of the system), need for closure (naturally uncomfortable with uncertainty; have to learn to live with it), confirmation bias, exposure effect (prefer familiar things), Hawthorne effect (people change when they&#8217;re being watched, but after a while they go back to how they were behaving), false memory (easy to confuse imagined events with real memories; every memory <em>read</em> is a <em>write</em> in light of the current context), symbolic reduction fallacy (L-mode is anxious to &#8220;symbol-away&#8221; complexity), nominal fallacy (thinking that labelling a thing means you understand it).</p>
<p>How to fight biases: understand that &#8220;rarely&#8221; doesn&#8217;t mean &#8220;never&#8221;, defer closure (you know the most about a project at the <em>end</em> of it, so don&#8217;t take decisions too early, be comfortable with uncertainty), remember that you don&#8217;t remember well. People are mainly a product of their environment and of the times. Explanation of different American generations on p. 125-131. In summary, generational archetypes are prophet (vision, values), nomad (liberty, survival, honor), hero (community, affluence) and artist (pluralism, expertise, due process). Realise where your thinking is coming from, what are your influences, and what kind of arguments you make. Try to have a diverse team so biases can catch/cancel each other. Myers Briggs Type Indicator discussion on p. 133-135. <em>Trust intuition, but verify</em>. If you think you have defined something, try to define the opposite.</p>
<h2>Learn Deliberately</h2>
<p>A single intense, out-of-context classroom event can only get you started in the right direction. You need continued goals, feedback to understand your progress and approach it far more deliberately than a once-a-year course.</p>
<p>For any goal (desired state, usually short-term) you have in mind you need a plan, a series of objectives (steps towards that goal). Objectives should be Specific (&#8220;learn Erlang&#8221; vs. &#8220;be able to write a web server in Erlang that dynamically generates content&#8221;), Measurable (how do you know when you&#8217;re done? related to &#8220;specific&#8221;. You don&#8217;t have to see where you&#8217;re going, just a couple of meters ahead of you), Achievable (from the current state!), Relevant (does it matter to you? is it under your control?) and Time-boxed (perhaps the most important: the deadline).</p>
<p>Create Pragmatic Investment Plans (PIP) to learn whatever you want to learn. Major point involving managing the plan:</p>
<ul>
<li><em>Have a concrete plan</em>: devise different levels of goals (now, next year, next five years).</li>
<li><em>Diversify</em>: make an effort to choose different methodologies, languages, industries, and non-technical stuff.</li>
<li><em>Active investment</em>: need to be able to evaluate your plan and realistically judge how&#8217;s going. Adapt/change the plan based on that.</li>
<li><em>Invest regularly</em>: you need to make a commitment to invest a minimum of time on a regular basis. Create a ritual, if needed.</li>
</ul>
<p>Other techniques, like mind maps, talk to the duck and learning by teaching are mentioned in this chapter, but I&#8217;m skipping them in the summary.</p>
<p>And this is the end of the second part of my summary. The next one will cover the rest of the book, namely chapters &#8220;Gain experience&#8221;, &#8220;Manage Focus&#8221; and &#8220;Beyond Expertise&#8221;.</p>
<p><strong>EDIT:</strong> read the <a href="http://hcoder.org/2011/10/12/book-summary-pragmatic-thinking-learning-iii/">third part</a> of this summary.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1185&amp;md5=9b20e4e00e84d6f8f36b52c24ff94e1e" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/10/11/book-summary-pragmatic-thinking-learning-ii/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=1185&amp;md5=9b20e4e00e84d6f8f36b52c24ff94e1e" type="text/html" />
	</item>
		<item>
		<title>Book summary: Pragmatic Thinking &amp; Learning</title>
		<link>http://hcoder.org/2011/10/10/book-summary-pragmatic-thinking-learning/</link>
		<comments>http://hcoder.org/2011/10/10/book-summary-pragmatic-thinking-learning/#comments</comments>
		<pubDate>Mon, 10 Oct 2011 22:44:48 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Book summaries]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[brain]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://hcoder.org/?p=1177</guid>
		<description><![CDATA[This is the first part of my summary of &#8220;Pragmatic Thinking &#38; Learning&#8220;, by Andy Hunt. It&#8217;s a book about how the brain works and how to take more advantage of it. It explores many interesting topics, like learning, focusing, the brain modes of operation, etc. Do note that I&#8217;ll skip many techniques/lessons in the [...]]]></description>
			<content:encoded><![CDATA[<p>This is the first part of my summary of &#8220;<a href="http://pragprog.com/book/ahptl/pragmatic-thinking-and-learning">Pragmatic Thinking &amp; Learning</a>&#8220;, by Andy Hunt. It&#8217;s a book about how the brain works and how to take more advantage of it. It explores many interesting topics, like learning, focusing, the brain modes of operation, etc. Do note that I&#8217;ll skip many techniques/lessons in the summary, sometimes because they were less interesting for me (as in, I didn&#8217;t think they would work for me), sometimes because I already practise them. This first part will cover the introduction (<a href="http://media.pragprog.com/titles/ahptl/intro.pdf">in PDF</a>), and chapters &#8221;Journey from Novice to Expert&#8221; (<a href="http://media.pragprog.com/titles/ahptl/chap2.pdf">in PDF</a>) and &#8220;This is Your Brain&#8221;.</p>
<h2>Introduction</h2>
<p>Despite advances in programming languages, techniques, methodologies, &#8230;, the defect density has remained fairly constant. Maybe we&#8217;re focusing on the wrong things: software is created in your head.</p>
<p>You don&#8217;t get <em>taught</em>, you have to <em>learn</em>. Everything is connected, there&#8217;s nothing in isolation, so sometimes small things can have unexpectedly larger effects.</p>
<h2>Journey from Novice to Expert</h2>
<p>The novice needs clear, context-free rules to operate, but an expert is ineffective when constrained by those same rules. Experts don&#8217;t just &#8220;know more&#8221; than novices, they experience fundamental differences in how they perceive the world, approach problem solving, etc. The stages of learning in the Dreyfus model are:</p>
<ul>
<li><em>Novices</em>. Have little or no previous experience in this skill area (&#8220;experience&#8221; results in a change of thinking; doing the same for years doesn&#8217;t count!). They don&#8217;t particularly want to learn, want to accomplish an immediate goal, don&#8217;t know how to respond to mistakes and are fairly vulnerable to confusion when things go awry (example of doing taxes for years on p. 20).</li>
<li><em>Advanced Beginners</em>. Can start to break from the fixed rule set a little bit. Can try tasks on their own but have trouble troubleshooting. They want information fast (eg. API reference) and can start using advice in the correct context, but don&#8217;t have a holistic understanding and really don&#8217;t want it yet.</li>
<li><em>Competent</em>. Can develop mental models and work with them effectively, troubleshoot problems on their own, and begin to figure out how to solve novel problems, as well as seek and take advice from experts. They&#8217;re typically described as &#8220;having initiative&#8221; or &#8220;resourceful&#8221; and tend to be in a leadership role in the team (formal or not). They&#8217;re great to have on your team because they can mentor the novices while not annoying the experts.</li>
<li><em>Proficient</em>. Need the big picture, and thus will seek out and try to understand the larger conceptual framework around the skill. They&#8217;re frustrated by simplified information. This is the first level that can correct previous poor performance and revise their approach. They can also learn from the experience of others, which comes with the ability to understand and apply <em>maxims</em>.</li>
<li><em>Experts</em>. Primary sources of knowledge and information in any field, continually looking for better methods and better ways of doing things. Statistically, there aren&#8217;t many: probably around 1-5%. Experts work on intuition, not reason. They may be completely inarticulate as to how they arrived at a conclusion. They aren&#8217;t perfect though, and have the same cognitive biases as everyone else. They&#8217;re also likely to disagree with one another.</li>
</ul>
<p>Most people, for most skills, never get past the second stage. Plus, practitioners at a lower skill level have a marked tendency to overestimate their own abilities. Note that you want a mix of skills on a team. See &#8220;10 years to expertise&#8221; on p. 32. The dangers of overreliance on formal models (I&#8217;m skipping some in this list!):</p>
<ul>
<li><em>Confusing the model with reality</em>. It&#8217;s easy to confuse the two, but they aren&#8217;t the same.</li>
<li><em>Devaluing traits that cannot be formalised</em>. Good problem-solving skills are critical to our jobs, but problem solving is a very hard thing to formalise.</li>
<li><em>Legislating behaviour that contradicts individual autonomy</em>. You want thinking, responsible developers. Don&#8217;t reward herd behaviour.</li>
<li><em>Alienating experienced practitioners in favour of novices</em>. Targeting your methodology to novices, you create a poor working environment for the more experienced.</li>
<li><em>Oversimplification of complex situations</em>. Every project/situation is more complex than that.</li>
<li><em>Demand for excessive conformity</em>. What worked great in your last project might be a disaster in the next one.</li>
<li><em>Insensitivity to contextual nuances</em>. Formal methods are geared to the typical, not the particular. But when does the &#8220;typical&#8221; ever happen?</li>
<li><em>Mystification</em>. Speech becomes so sloganised that it becomes trivial and loses meaning (eg. &#8220;we&#8217;re a customer-focused organisation&#8221;).</li>
</ul>
<h2>This is your brain</h2>
<p>You have two &#8220;CPUs&#8221;: the linear, logical thought and language processing CPU (&#8220;L-mode&#8221;, for &#8220;linear&#8221;; the &#8220;left part of the brain&#8221;); and the searching and pattern matching CPU (The &#8220;R-mode&#8221;, for &#8220;rich&#8221;; the &#8220;right part of the brain&#8221;). They share the same bus so they can&#8217;t function at the same time.</p>
<p>R-mode can search &#8220;asynchronously&#8221; and come up with the response (possibly days) later. It doesn&#8217;t do any verbal processing, so the results are not verbal either (eg. trying to describe dreams). Also, it&#8217;s not under our direct concious control: as it can give answers anytime, we have to be ready to write down anything that comes up (related: <em>everyone</em> has good ideas, but far fewer <em>track</em> them; of those, even fewer bother to <em>act</em> on those ideas, and even fewer of those have the resources to make a good idea a success). It is very concrete, relating things as they are; it makes analogies and doesn&#8217;t require reason or known facts to process input. It&#8217;s holistic and wants to see the whole thing at once, perceiving overall patterns and structures. It&#8217;s intuitive, making leaps of insight, based on incomplete patterns, hunches, feelings or visual images. It&#8217;s very useful for software design.</p>
<p>Synthesis can be good for learning, see &#8220;<a href="http://web.media.mit.edu/~nicholas/Wired/WIRED2-07.html">Don&#8217;t Dissect the Frog, Build It</a>&#8221; on p. 62. Aesthetics also make a difference, see p. 66-67. The brain is wonderfully plastic. There&#8217;s no limit to the number of skills you can learn, <em>as long as you believe it</em> (ie. what you think about your brain capabilities physically affects the &#8220;wiring&#8221; of the brain itself).</p>
<p>And that&#8217;s all for now. The next part will cover chapters &#8221;Get in Your Right Mind&#8221; and &#8220;Debug Your Mind&#8221;.</p>
<p><strong>EDIT:</strong> read the <a href="http://hcoder.org/2011/10/11/book-summary-pragmatic-thinking-learning-ii/">second part</a> of this summary.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=1177&amp;md5=3a009471028332e927f6e8dc7cd09c64" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2011/10/10/book-summary-pragmatic-thinking-learning/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=1177&amp;md5=3a009471028332e927f6e8dc7cd09c64" type="text/html" />
	</item>
		<item>
		<title>My first contributions to CPAN</title>
		<link>http://hcoder.org/2009/06/28/my-first-contributions-to-cpan/</link>
		<comments>http://hcoder.org/2009/06/28/my-first-contributions-to-cpan/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 20:46:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[bsd]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[migraine]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[parsing]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I have been using Perl for many years, but I had never uploaded anything to CPAN. That&#8217;s unfortunate, because I&#8217;ve probably written several programs or modules that could have been useful for other people. The point is, now I have. Not only that, but it was code I wrote at work, so if I&#8217;m not [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using Perl for many years, but I had never uploaded anything to <span class="caps">CPAN</span>. That&#8217;s unfortunate, because I&#8217;ve probably written several programs or modules that could have been useful for other people. The point is, now I have. Not only that, but it was code I wrote at work, so if I&#8217;m not mistaken these are my first contributions to free software from Opera. Yay me!</p>
<p>The two modules I&#8217;ve released so far are:</p>
<ul>
<li><a href="http://search.cpan.org/~opera/Parse-Debian-PackageDesc-0.1/lib/Parse/Debian/PackageDesc.pm">Parse::Debian::PackageDesc</a>, a module for parsing both <code>.dsc</code> and <code>.changes</code> files from Debian. This is actually a support module for something bigger that I hope I&#8217;ll release soon-ish.</li>
<li><a href="http://search.cpan.org/~opera/Migraine-0.53/script/migraine.pl">Migraine</a>, a still somewhat primitive database change manager inspired on the <a href="http://www.oracle.com/technology/pub/articles/kern-rails-migrations.html">Ruby on Rails migration system</a>.</li>
</ul>
<p>As I feel that Migraine could be useful to a lot of people, but it&#8217;s easy to misunderstand what it really does (unless you already know Rails migrations of course), I&#8217;ll elaborate a bit. Imagine that you are developing some application that uses a database. You design the schema, write some <span class="caps">SQL</span> file with it, and everybody creates their own databases from that file. Now, as your application evolves, your schema will evolve too. What do you do now to update all databases (every developer installation, testing installations, and don&#8217;t forget the production database)? One painful way to do it could be documenting which <span class="caps">SQL</span> statements you have to execute in order to have the latest version of the schema, and expect people to apply copying-and-pasting from the documentation. However, it&#8217;s messy, confusing, and it needs someone to know both which databases to update and when.</p>
<p>Migraine offers a simpler, more reliable way to keep all your databases up to date. Basically, you write all your changes (&#8220;migrations&#8221;) in some files in a directory, following a simple version number naming convention (e.g. <code>001-add_users_table.sql</code>, <code>002-change_passwd_field_type.sql</code>), and migraine will allow you to keep your databases up to date. In the simplest, most common case, you call migraine with a configuration file specifying which database to upgrade, and it will figure out which migrations are pending to apply, if any, and apply them. The system currently only supports raw <span class="caps">SQL</span>, but it should be easy to extend with other types.</p>
<p>In principle, you shouldn&#8217;t need to write any Perl code to use migraine (it has a Perl module that you can use to integrate with your Perl programs if you like, but also a command-line tool), so you can use it even in non-Perl projects. Of course, some modern ORMs have their own database migration system, but very often you have to maintain legacy code that doesn&#8217;t use any fancy <span class="caps">ORM</span>, or you don&#8217;t like the migration system provided by the <span class="caps">ORM</span>, or you prefer keeping a single system for schema and data migrations&#8230; I think in those cases Migraine can help a lot reducing chaos and keeping things under control. Try it out and tell me what you think <code>:-)</code></p>
<p>In a couple of days I&#8217;ll blog again about other contributions to free software I&#8217;ve made lately, but this time in the form of Opera widgets&#8230;</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=70&amp;md5=cd018dfe396c05a453fc32d752754b46" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2009/06/28/my-first-contributions-to-cpan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=70&amp;md5=cd018dfe396c05a453fc32d752754b46" type="text/html" />
	</item>
		<item>
		<title>Free software rocks!</title>
		<link>http://hcoder.org/2009/05/10/free-software-rocks-2/</link>
		<comments>http://hcoder.org/2009/05/10/free-software-rocks-2/#comments</comments>
		<pubDate>Sun, 10 May 2009 17:18:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[apt]]></category>
		<category><![CDATA[command]]></category>
		<category><![CDATA[cpan]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[line]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I&#8217;ve been working on something lately that I hope I will publish sometime next month: it&#8217;s a set of tools to manage an APT package repository. The idea is that, given an upload queue (you can set it up as an anonymous FTP, or some directory accessible via SSH/SCP, or whatever floats your boat in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on something lately that I hope I will publish sometime next month: it&#8217;s a set of tools to manage an <span class="caps">APT</span> package repository. The idea is that, given an upload queue (you can set it up as an anonymous <span class="caps">FTP</span>, or some directory accessible via <span class="caps">SSH</span>/<span class="caps">SCP</span>, or whatever floats your boat in your setup and team), you&#8217;ll have a web interface to approve those packages, a set of integrated autobuilders building the approved packages in whatever combination of architectures and distributions you want, and all that integrated with <a href="http://mirrorer.alioth.debian.org/">reprepro</a> to keep your repository updated. I&#8217;ll write more about it when I have released something.</p>
<p>The point now is that, while working on it, I needed some module to parse command-line options and &#8220;subcommands&#8221; (like <code>git commit</code>, <code>svn update</code>, etc.). As it&#8217;s written in Perl, I had a look at <span class="caps">CPAN</span> to see if I could see anything. The most promising module was <a href="http://search.cpan.org/~garu/App-Rad-1.04/lib/App/Rad.pm">App::Rad</a>, but it lacked a couple of things that were very important for me: my idea was &#8220;declaring&#8221; all the possible commands and options and have the module do all the work for me (generating the help pages and the default <code>--help</code> implementation, generate the <code>program help subcommand</code> and so on). <code>App::Rad</code> didn&#8217;t have that, and it didn&#8217;t seem to me like that was the direction they wanted to go to with the module. But I figured I&#8217;d drop the author an e-mail anyway and see if he liked the idea so I could start adding support for all that&#8230;</p>
<p>And boy was that a good idea. He replied a couple of days later, and said that they had liked the idea so much that they had implemented it already (that&#8217;s why he took a couple of days to reply), and he sent me an example of the new syntax they had introduced and asked if that was what I was thinking. And not only that, but they added me to the list of contributors just for giving the idea! That completely made my day, free software rocks!</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=67&amp;md5=09105bb993941bce2a37855f1e18b32b" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2009/05/10/free-software-rocks-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=67&amp;md5=09105bb993941bce2a37855f1e18b32b" type="text/html" />
	</item>
		<item>
		<title>Software patents. Yet yet yet yet YET YET again</title>
		<link>http://hcoder.org/2008/05/19/software-patents-yet-yet-_yet-yet_-yet-yet-again/</link>
		<comments>http://hcoder.org/2008/05/19/software-patents-yet-yet-_yet-yet_-yet-yet-again/#comments</comments>
		<pubDate>Mon, 19 May 2008 23:06:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Freedom]]></category>
		<category><![CDATA[ffii]]></category>
		<category><![CDATA[mccreevy]]></category>
		<category><![CDATA[patents]]></category>
		<category><![CDATA[press]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[swpats]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[One week ago (but I just noticed), FFII published this press release about McCreevy trying to legalise Software Patents. I haven&#8217;t had time to read the whole thing, but this is just amazing. I mean, doesn&#8217;t Mr. McCreevy get fucking bored, if nothing else? We don&#8217;t want your filthy software patents. We have said so [...]]]></description>
			<content:encoded><![CDATA[<p>One week ago (but I just noticed), <span class="caps">FFII</span> published this <a href="http://press.ffii.org/Press_releases/McCreevy_wants_to_legalise_Software_Patents_via_a_US-EU_patent_treaty">press release about McCreevy trying to legalise Software Patents</a>. I haven&#8217;t had time to read the whole thing, but this is just amazing. I mean, doesn&#8217;t <a href="http://en.wikipedia.org/wiki/Charles_McCreevy">Mr. McCreevy</a> get fucking <em>bored</em>, if nothing else?</p>
<p><strong>We don&#8217;t want your filthy software patents.</strong> We have said so many many times. Now go and [censored] yourself, find something useful to do for Europe.</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=25&amp;md5=ad4f9d77bc188f65f2465eb09f5bff3f" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2008/05/19/software-patents-yet-yet-_yet-yet_-yet-yet-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=25&amp;md5=ad4f9d77bc188f65f2465eb09f5bff3f" type="text/html" />
	</item>
		<item>
		<title>Free Software rocks</title>
		<link>http://hcoder.org/2008/05/12/free-software-rocks/</link>
		<comments>http://hcoder.org/2008/05/12/free-software-rocks/#comments</comments>
		<pubDate>Mon, 12 May 2008 22:18:00 +0000</pubDate>
		<dc:creator>emanchado</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[quotes]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[thanks]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I just read in Aaron Seigo&#8217;s blog a very nice message from a user that proves that free software is making a difference in many areas, even in some that we don&#8217;t usually think about. Some quote: I cant tell you how much I appreciate the work you all have done. Its a work of [...]]]></description>
			<content:encoded><![CDATA[<p>I just read in <a href="http://aseigo.blogspot.com/">Aaron Seigo&#8217;s blog</a> a <a href="https://lists.ubuntu.com/archives/ubuntu-devel-discuss/2008-May/004196.html">very nice message</a> from a user that proves that free software is making a difference in many areas, even in some that we don&#8217;t usually think about. Some quote:</p>
<blockquote>
<p>I cant tell you how much I appreciate<br />
the work you all have done. Its a work of art. If I could thank each and every one of<br />
you I would.</p>
</blockquote>
<blockquote>
<p>You have given her the world to learn and explore.</p>
</blockquote>
<blockquote>
<p>So if you get frustrated or tired in<br />
your work for Open Source/Free Software, just remember that somewhere in Missouri<br />
there is a 14 year-old girl named Hope, an A-student who runs on the track team,<br />
who is now your biggest fan and one of the newest users of Linux/Ubuntu.</p>
</blockquote>
<p>Although I haven&#8217;t really participated in <span class="caps">KDE</span> or Ubuntu (not directly anyway), I too feel proud of what we, as a community, have created. Also, like that person, I feel very thankful for everything I have learned and got from the free software community.</p>
<p>Cheers guys, you all rock!</p>
 <p><a href="http://hcoder.org/?flattrss_redirect&amp;id=23&amp;md5=751b24007ac6b97a1f7d5b1e95cb0bdb" title="Flattr" target="_blank"><img src="http://hcoder.org/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://hcoder.org/2008/05/12/free-software-rocks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="http://hcoder.org/?flattrss_redirect&amp;id=23&amp;md5=751b24007ac6b97a1f7d5b1e95cb0bdb" type="text/html" />
	</item>
	</channel>
</rss>

