January 2014 Newsletter
Everyone you will ever meet knows something you don't. –Bill Nye
Our highest endeavor must be to develop free human beings who are able of themselves to impart purpose and direction to their lives. The need for imagination, a sense of truth, and a feeling of responsibility—these three forces are the very nerve of education. –Rudolf Steiner
Hold fast to dreams,
For if dreams die,
Life is a broken-winged bird
That cannot fly.
Hold fast to dreams.
For if dreams go,
Life is a barren field
Covered with snow.
–Langston Hughes
But there is only one thing that has power completely, and this is love. Because when a man loves, he seeks no power, and therefore he has power. –Alan Paton, Cry, The Beloved Country
There is no right answer... and always a better way. Show and discuss your code, without emotional attachment. You are not your code. –Bruce Eckel
You may be deceived if you trust too much, but you will live in torment if you do not trust enough. –Frank Crane
You should never ask people about their opinions directly. You should observe them, figure out what's wrong and then slowly figure out where the true problem lies. –Armin Ronacher
One of the distinct differences of agile methodologies compared to
traditional processes is how requirements are developed and managed. This excellent hour-long video goes through
the entire agile requirements process including development of features and
user stories through the change process as the user request was implemented.
http://www.requirementsmanagement.net/videos/agile-requirements-a-self-building-documentation/
As developers, we must remember that users of the systems we create see
those systems as tools. This excellent
article explains the difference in mind-set with respect to applications
between users and programmers and provides some good context for how to bridge
the gap between the two groups.
http://pgbovine.net/two-cultures-of-computing.htm
The author of one of the most widely used textbooks on software engineering
gives his predictions for what will and won’t change in programing over the
next 20 years. One of his predictions is
that, due to complexity, tolerance for failure of systems will become standard
(Isn’t it already?! J), but systems will be more robust and resilient
in the face of failure. Also,
interestingly, he suggests that the process of development will be much the
same as it is today.
http://iansommerville.com/techstuff/software-engineering-looking-forward-20-years/
One of the common principles of agile teams is maintaining the team
membership, as much as possible. But
what do you do if you need to move folks around? This article presents some ideas for dealing
with this inevitability.
http://www.infoq.com/news/2013/12/change-composition-teams
You might sub-title this article “Taking Agile to the Extreme”. This article looks at how to develop an
application without all of the usual trappings of effort/duration estimates,
detailed specifications, and the like.
While most organizations probably aren’t mature enough for this
approach, there are plenty of good ideas that apply generally.
http://blog.hut8labs.com/no-deadlines-for-you.html
One of the most difficult (and frequent and frustrating!) aspects of
programming is estimation
of effort for implementing a feature or function. No matter how hard we try, it is nearly
impossible to get reasonably accurate (+/-25% in my view!) estimates. This article discusses some of the background
for these difficulties and offers some mitigation strategies, including adding
up to 50% (wow!) of buffer to estimates.
(Personally, I prefer the 3-point estimate
approach, which, of course, isn’t perfect.)
http://understandageek.com/2011/11/14/qa-why-do-we-programmers-deadlines/
In working with agile methodologies for a few years, I’ve observed that
it is very easy fall into the trap of “high ceremony” agile. This article takes the Agile Manifesto and
then breaks it down into how to apply each of the principles effectively and
minimally, in the true agile spirit.
http://wrongsideofmemphis.com/2013/12/16/agile-important-parts/
From the outsider’s point of view, they are probably curious why there
are so
many programming languages (and doubtless that this list is incomplete!),
with many more popping up like mushrooms each year. The fundamental premise behind each language,
many intended for very specific tasks or domains, is that it is intended to
make developers more productive: get
more done in less time. However, as this
article explores, almost everything we know about programmer productivity
related to language choice is strictly anecdotal.
http://blog.smartbear.com/programming/exploring-programming-languages-science-and-folklore/
This is an insightful summary of where developer mind-share is headed,
based on the top (most active) Java, JavaScript, and Ruby projects on Github. Some of the
findings include significant fragmentation in the JavaScript world, mocking is
gaining traction in Java and Ruby, and NoSQL is
giving MySQL a run for its money in the Java domain.
This essay takes another look at the age old question of how to measure
developer productivity. While it
certainly doesn’t resolve the matter, it offers some interesting insights about
motivation and the role of management in the development process. See this Hacker News thread
for some interesting comments.
http://mikehadlow.blogspot.co.uk/2013/12/are-your-programmers-working-hard-or.html
Since programming and software development are human endeavors, they are
subject to all of the limitations that we have.
This article emphasizes that the most difficult things that developers
do have little to do with writing code.
http://www.sitepoint.com/ten-toughest-tasks-development/
While mostly a discussion of the academic definition of program correctness, this article has some interesting perspectives on how complexity affects the likelihood of defects, which may give you some ideas for how to approach white-box testing.
http://www.usrsb.in/probability-of-a-correct-program.html
Even with the wide-spread adoption of agile methodologies, specialized/dedicated testers are still the norm for most projects, according to a new survey. In fact, the distribution of testing responsibilities has essentially remained the same over the past six years.
I remember setting up my first test lab (in the Windows 3.x days) with a few cast-off 486 PCs. As much as technology has changed in the development world in the past several years, perhaps more is different in testing. In particular, virtualization has revolutionized testing. This article covers some of the ideas that are key to agile testing.
http://www.infoq.com/articles/perfect-dev-test-lab
Financial matters are often low on the priority list for technology workers. But, that seems odd, since most of us work mainly to get money to support ourselves and our families. This brief, but thorough guide explains stock options in simple language with analogies that will make sense to the technically-minded.
http://blog.alexmaccaw.com/an-engineers-guide-to-stock-options
Sooner or later, you are going to do something in git where you wish you could change it. This is a thorough, yet understandable explanation of how to undo, correct, or even remove (after other commits have been done!) an errant commit.
http://sethrobertson.github.io/GitFixUm/fixup.html
While certainly intended to try to sell you on their development tools, this multi-part tutorial series gives an excellent explanation of the concepts and practices of test-driven development (TDD). The author thoroughly explains everything and provides plenty of examples, including how to do mocking, which is often overlooked in many TDD tutorials.
http://blogs.telerik.com/james-bender/posts/13-09-09/30-days-tdd-day-one-what-is-tdd
I’m not primarily a visual learner, but we’re all familiar with the idea that the picture is worth a thousand words. This excellent site shows animations of a variety of common algorithms and data structures to help you understand how they work. Source code is available for all of them, so you can dissect them for your own edification.
http://www.cs.usfca.edu/~galles/visualization/Algorithms.html
You have probably heard about Node.js and developing in JavaScript on the server side, but you may be unfamiliar with why you would want to use it. This article explains many of the concepts that underpin Node.js to give a feel for how and when to apply it.
http://www.phloxblog.in/brief-note-node-js-understanding/
One of the best ways that I’ve found to learn (or improve your skills with) a programming language is to answer questions to test your conceptual understanding. This tutorial helps you learn C++ by showing you a code snippet and asking a question, such as the output. Each question has a difficulty rating and you can ask for a hint, if you get stuck.
This essay discusses how our cultural fixation (and rewarding) of “busyness” is actually a character flaw and offers suggestions for trading “hard work” for doing work that matters at a reasonable pace.
https://medium.com/content-creators-curators/348a9f60e176
Most of us know that sleep deficits are one of the main causes of errors and poor performance. And, yet, our culture still promotes the hero mentality around getting less than the necessary amount of sleep (which, of course, varies from person to person). This article shows that we are starting to recognize the importance of sufficient rest and the economic costs of not getting enough.
http://blogs.hbr.org/2013/11/real-men-go-to-sleep/
One of the unanticipated consequences of the economic downturn and the federal stimulus (‘quantitative easing’) is that instead of hiring additional workers, many businesses opted to increase investment in software to improve productivity. In fact, business spending on software has increased 19% since 2007. And, during that same period, automation has continued to under-cut hiring in the jobs in the middle of the economic spectrum.
In counterintuitive new research, investigators found that just staying out of direct observation of management made workers 10% - 15% more productive. Moreover, they also determined that workers develop group norms that improve productivity, but hide them from management for fear of reprisal.
http://hbswk.hbs.edu/item/7343.html
On trait frequently seen in programmers and other technology workers is the perfectionist streak. We like order and completeness. But this often puts us at odds with our business counterparts. This article gives some suggestions for how to maintain application quality and integrity and still deliver your product.
http://growingsoftware.org/overcoming-perfection/
It’s no secret that broadband Internet speeds in the US lag far behind other countries. In a step toward perhaps improving this, the ITU has given preliminary approval to the G.fast standard which could provide transmission speeds currently only available via fiber over copper lines for locations within 250 meters of the distribution node.
The concept of software-defined networking (SDN) has been around for almost 5 years (maybe longer!). However, until now, hardware hasn’t been powerful and inexpensive enough to make a breakthrough against traditional routers and switches. This article indicates that SDN may start to be applied more broadly (or not) in 2014. With all of the struggles that most organizations have with “normal” software development, it will be interesting to see how effective SDN turns out.
This small, handy utility allows you to back up all of your web browser settings and configurations for Google Chrome, Chromium, Firefox, and Opera browsers. It saves everything into a compressed and, optionally, encrypted archive. It supports bookmarks, contacts, passwords, skins, toolbars, plugins, and many more browser-specific features. Browser Backup makes it easy to switch configurations, such as for cross-browser testing, without worrying about losing your regular settings.
http://cjcr-soft.com/software/browserbackup/
If you are new to Git, especially if you are coming from another version control tool, many of the shell commands can seem arcane and overwhelming. git-ext is a set of Bash shell scripts (you knew that even on Windows, the Git command prompt runs under Bash, right?) which provide “aliases” for the common commands that will probably feel more natural to you.
https://github.com/0xAX/git-ext
This cool console (command prompt, if you prefer) for Windows packages a number of great utilities, including ConEmu, clink, and msysgit, together with a powerful interface including great keyboard shortcuts to make you feel like you are working on a Linux machine, without the overhead of Cygwin. The entire package is completely portable so you can run from a USB drive and take all of your aliases and other customizations with you.
http://bliker.github.io/cmder/
Window Hacker (WndHack for short) is a tiny utility for inspecting and monitoring almost any type of window, both top-level and child windows, in Windows. Select which windows you want to monitor and you’ll be able to get details about them, send or post common WM_... messages to the window, query for parameters of the window, and even query for top-level windows.
http://aezay.site11.com/aezay/wndhack/
Almost every discipline has its own set of jokes, most of them enigmatic to outsiders. Even though most of us aren’t scientists in the conventional sense, you might get a chuckle (or groan!) out of some of these.
http://www.theguardian.com/science/2013/dec/29/scientists-favourite-jokes
Fortunately, I’m WAY beyond today’s dating scene. But with every cultural shift comes its impact on the courting rituals. Here’s a humorous look at the upsides and pitfalls of dating developers.
http://blog.koding.com/2013/11/pros-cons-dating-programmer/