Up to Newsletter Index

April 2015 Newsletter

Quotable Quotes

Will a machine replace you? Futurists can seem like they hope the answer is yes. Luddites are so worried about being replaced that they would rather we stop building new technology altogether. Neither side questions the premise that better computers will necessarily replace human workers. But that premise is wrong: computers are complements for humans, not substitutes. The most valuable businesses of coming decades will be built by entrepreneurs who seek to empower people rather than try to make them obsolete. –Peter Thiel, Zero to One

All of us do not have equal talent, but all of us should have an equal opportunity to develop our talent. –John F. Kennedy

I’m convinced that computer science grew so fast and is so vital today because there are people all over the world who have a peculiar way of thinking, a certain way of structuring knowledge in their heads, a mentality that we now associate with a discipline of its own. This mentality isn't sharply focused, in the space of all possible ways of thinking; but it's different enough from other ways—from the mentalities of physicists and mathematicians that I spoke of earlier—that the people who had it in the old days were scattered among many different departments, more or less orphans in their universities. Then suddenly, when it turned out that their way of thinking correlated well with being able to make a computer do tricks, these people found each other. –Donald Knuth, Things a Computer Scientist Rarely Talks About

If you want to build a ship, don’t drum up people to collect wood and don’t assign them tasks and work, but rather teach them to long for the endless immensity of the sea. –Antoine de Saint-Exupery

It is not that we have a short time to live, but that we waste a lot of it. Life is long enough, and a sufficiently generous amount has been given to us for the highest achievements if it were all well invested. But when it is wasted in heedless luxury and spent on no good activity, we are forced at last by death’s final constraint to realize that it has passed away before we knew it was passing. –Seneca, On the Shortness of Life

There is no programming language—no matter how structured—that will prevent programmers from making bad programs. –Larry Flon (1975)

The servant-leader is servant first… It begins with the natural feeling that one wants to serve, to serve first. Then conscious choice brings one to aspire to lead. That person is sharply different from one who is leader first, perhaps because of the need to assuage an unusual power drive or to acquire material possessions…The leader-first and the servant-first are two extreme types. Between them there are shadings and blends that are part of the infinite variety of human nature…The difference manifests itself in the care taken by the servant-first to make sure that other people’s highest priority needs are being served. The best test, and difficult to administer, is: Do those served grow as persons? Do they, while being served, become healthier, wiser, freer, more autonomous, more likely themselves to become servants? And, what is the effect on the least privileged in society? Will they benefit or at least not be further deprived? –Robert K. Greenleaf, Essentials

Return to top

Software Development Process and Methodology

Article: The repeated deaths of OOP

Mark Twain once said, “The report of my death was an exaggeration.” Perhaps the same claim can be made about the object-oriented programming paradigm, as well. This author says that that OOP has been declared dead (irrelevant) at least four times, but, yet, it’s still the dominant approach used in practice. Moreover, he says that introduction of functional programming paradigms, like lambdas and closures, to OOP languages like Java really represent natural evolution of OOP. Or perhaps there is some middle ground between OOP and FP.


Article: Do you practice “Datensparsamkeit”?

Even though I can’t pronounce Datensparsamkeit, the underlying concept of “economy of data” seems like a salient one in almost any organization, especially with the growth of data continuing at an incredible pace. In particular, I believe that it is imperative that when designing and developing systems that we clearly understand why our customers need a certain bit of data and how it will be used. Frequently, it seems that data is often specified, but rarely used or maintained effectively. Perhaps we need a focus on “data hygiene”.


Article: Choose Boring Technology

This author suggests then when making technology decisions, such as platforms, programming languages, libraries, and the like, your chances of success are improved by choosing “boring” technologies, which he defines as those that are tried and true, have good community support, and, most importantly, have well understood failure modes. This last point is the crux of his argument, since it affects your ability to get past sticking points in your development process. And this approach is helpful in avoiding (or overcoming!) the “not invented here” mayhem (see next article).


Article: Never Invent Here: the even-worse sibling of “Not Invented Here”

You are probably familiar with the “not invented here” principle that tends to discredit the value of tools or solutions developed by those outside of your team. This author explores a more insidious cousin that he calls “never invent here” which results when teams and team member are so micro-managed or they spend so much time evaluating various options that they become ineffective and unable to actually get any useful work done. The worst aspect of this syndrome is that developers lose interest in the work, because they aren’t involved the creative part of the work of technical problem solving.


Article: Q&A on Agile! The Good, the Hype and the Ugly

This broadly ranging interview with Bertrand Meyer discusses his new book, which is a retrospective of sorts of the agile development movement. The most interesting aspect of the interview (and the book) is how Meyer compares and contrasts the academic view of agile and other methodologies with the actual practice in industry. It provides some good insight into how a rift between academia and the “real world” seems to be widening with respect to development philosophies.


Article: The Web’s Grain—A view on designing for the web

While this is a long and, at times, esoteric and philosophical article, I highly recommend reading it. As we are seeing the rapid convergence between “native” applications and “web” tools, the approach for design is also morphing, as well. This article gives you some insight into how technology folks can take these things into account when developing new applications.


Article: Scrum seems to be mostly about having better alibis

Ouch! If you follow Scrum or other agile methodologies, just the title of this article probably hurts. But the author makes a good point that agile has (at least somewhat) devolved into a process of gaming the system. Personally, I feel like it’s an example of the pendulum swinging too far from the extreme of rigid waterfall to an almost-anarchist anything-goes philosophy. Certainly, the author is correct that we need to re-think the methods to get back to the principles of the Agile Manifesto.


Article: The Role of Containers in Modern Applications

In this roundtable discussion, various perspectives are presented about how containers (think Docker) are, will be, and should be used as part of distributed application architecture. The bottom line is that container-based platforms are the wave of the future for almost all types of applications and developers need to start learning about them and preparing.


Article: Study finds that refactoring doesn’t improve code quality

One of the mantras that we are taught is to be good stewards of our code base and, frequently, that means refactoring when possible and appropriate. Well, a recent academic study of a small C# application found that refactoring had no appreciable impact on ability to analyze/understand or maintain the code. Certainly, this is just one example, so your mileage my vary.


Return to top

Software Testing & Quality

Article: Google Launches New Incentive Program for Bug Hunters

Google is doubling down on software security by adding a program to provide grants to security researchers who want to try to identify vulnerabilities in Googles products and applications. This should be a wake-up call to everyone that software testing is both important and valuable to organizations.


Article: How To Deal With Bugs Within The Iteration

On many of the agile development teams that I’ve been on, there has been debate about whether defects should be addressed within the iteration/sprint that they are found or whether they should be deferred and included in the planning/capacity for a future iteration, based on priority. While this article won’t necessarily settle this question, it does give you a nice example of one organizations workflow for defects in an agile environment.


Article: Software Testing From the Perspective of a Hardware Engineer

Most testers know that the context of the application under test and the associated perspective that we apply in developing and carrying tests is extremely important. In that vein, this article is extremely helpful in giving a very different perspective on testing than most of us are familiar with.


Article: Simple Testing Can Prevent Most Critical Failures

This research paper, accompanied by a half-hour video presentation, claims that failures of data-intensive systems can be reduced by simple testing of error-handling code, even if the system design is not known. The authors developed an open-source tool called Aspirator to check for these types of failures.


Article: Automated GUI testing with AutoHotKey

As this article shows, automated GUI testing does not have to be an expensive, protracted affair. You are probably familiar with AutoHotKey as a desktop automation tool for repetitive tasks (and even some very sophisticated applications like those from Mouser!). That same simplicity and power can be put to good use for some basic test automation.


Return to top


Tutorial: Mastering Git submodules

Code re-use is the holy grail of software development. However, as you probably know, re-using code is exceedingly difficult and most version control systems don’t help with the task. The Git submodule functionality can help, but it’s not easy to get the hang of it. This comprehensive tutorial peels back the curtain on this area and helps you make practical use of other repositories in your project.


Tutorial: Playing with Legos: The Inner-Workings of a Model-View-Controller (MVC) Web Application

Most readers of this newsletter are probably very familiar with the MVC application architecture. Nevertheless, this nice tutorial uses the concept of building with Legos (everyone’s favorite toy! ) to explain the concepts of MVC.


Tutorial/Reference: A Guide to Project Management

This comprehensive online books covers the major topics of project management. It starts with the traits of good project managers and then moves to estimation, managing expectations, dealing with scope creep, and other relevant topics. It’s an excellent introduction to project management, suitable for anyone on a project team.


Tutorial: An introduction to reactive programming

In many cases, old paradigms are revived and renamed. The event-driven approach to programming has been recast as “reactive”. I grant that reactive programming does bring some new concepts with it. If you want to get started with this paradigm, this tutorial is a great place to start, which includes relevant examples in Scala, which is nice because you can use them on both server and client side, via Scala.js.


Tutorial: JavaScript inheritance example

If you come from using class-based object-oriented languages, such as Java and C++, JavaScript’s OOP style can be confusing, especially when it comes to inheritance. JavaScript is a prototypal language, which means that you build a prototype (“example”) of your class and then create other classes that use the prototype class a “template”. This tutorial explains it very well using examples.


Reference: JavaSED

The SED in JavaSED stands for Search, Examples, and Discussions. Thus, JavaSED is a Java-specific search engine with a difference, in that, in addition to search source code, you can search for examples and/or discussions about Java programming topics. It probably won’t replace Google (or your favorite search engine), but it’s a good place to start when looking for some of the esoteric aspects of Java programming.


Return to top

Career Development/Miscellaneous

Article: Companies really want Linux-savvy employees and they want them now

Looking to improve your prospects for landing a new job? According to a new survey from the Linux Foundation, there is significant demand for programmers and system administrators with Linux skills. The positions run the gamut from cloud services to security to software-defined networking, but the biggest demand segment is with cloud and container technologies.


Article: Why should developers study writing?

Good writing, as many of you know, is a passion of mine. Nevertheless, many technical workers don’t see the importance or value of clear, concise writing. This article gives some simple, yet practical tips about why everyone should seek to improve their writing skills.


Article: 11 Rules All Programmers Should Live By

I know that you’re probably thinking, “I don’t need another set of rules to follow!” But these are really more like principles and best practices for personal development. And, certainly, any list couldn’t be all-inclusive, but this really is a great list of concepts to do your best development work.


Article: In polite disagreement

Do we have a (or an impending) programmer shortage? Or not? Regardless of your position on this, this topic has sparked an interesting debate about whether productivity can be increased by developing better tools (and practices, such as strong typing, etc.) or by training more people in development.


Return to top

Useful Utilities

Alt-C (Free – Windows and Android – 1.3MB)

Alt-C is a handy application pair that allows you to copy text between your Windows desktop and Android phone or table. It works in both directions and the process is secure as the data is transferred using SSL via Google Cloud Messaging service.


tmate (Free – Linux/Mac OS X – 1.2MB)

This tool is an extension of the awesome tmux application that allows you to share shell/console/terminal sessions on your machine with others over the Internet. It provides full interactivity and is a great tool for pair programming or giving demos.


Zeal (Free – Windows/Linux – 35MB)

Zeal is an open-source offline API documentation browser, inspired by the (commercial) Dash tool for Mac OS X/iOS. It is compatible with all Dash document sets and the package includes all 150+ document sets that are part of the standard Dash installation.


Booklight (Free – Cross-platform Google Chrome extension – N/A)

Do you have oodles of bookmarks in Chrome? And, if so, do you struggle to find the bookmark you need? Booklight aims to fix this problem by allowing you to add a bookmark in any category/folder directly, filter bookmarks using fuzzy matching, clean the URL (remove query strings and other cruft) before bookmarking, and much more.


Gimphoto (Free – Windows/Linux/Mac OS X – 27MB)

GIMP is the de facto standard for open-source graphic editing tools. But, in many instances, it’s way more than most of us need to typical editing. Gimphoto is slimmed-down version with sane defaults and simplified menus and palettes. It hides much of the complexity of GIMP, while still offering a good bit of the power.


Optimizer for Eclipse (Free – Cross-platform – 2.0MB)

Eclipse is a great IDE, but, if you’ve used it for very long, you’ve doubtless run into slowdowns and other strange behavior. Optimizer for Eclipse aims to fix some of these. It profiles your Eclipse configuration and looks for problems such as insufficient memory allocation, large indexes, slow JDK performance, and more.


TransWin (Free – Windows – 458kB)

TransWin is a simple, one-function utility for Windows that allows you to set the transparency level of any window quickly and easily. And since it’s an AutoHotkey script, you can easily customize it to your specific needs or situation.


Return to top

Productivity Tips

Use less +F to monitor log files in Unix/Linux

If you’ve used Unix/Linux for a while, you probably have muscle memory built around running tail -f to watch an application log file. However, using less +F is a better option, because you can “suspend” the monitoring mode with <Ctrl>+C and enter the “normal” less mode to search for a string. Just press F to resume monitoring (“tailing”, if you prefer!) the file. The one situation where less has trouble is when you want to monitor multiple files; you’ll be better off sticking with tail -f for that case.

Re-run last shell/console command with sudo in Linux/Unix

If you execute a command in the Linux/Unix shell/console and it fails, because it requires root permissions, you can simply enter sudo !! to repeat that command with sudo. Basically, !! just tells the shell that you want to re-run the last command, so you can apply it in a variety of ways, such as passing the output to grep; for example, !! | grep name. And you can even reference commands farther back in the history with !-2, !-3, and so on.

Determine which Windows services are running in each svchost.exe instance

If you’ve ever looked at the Windows Task Manager Processes list and wondered why there are so many svchost.exe processes, here are a couple of tips to help with this. In Windows, services are organized into logical groups. Each svchost.exe instance manages one such group. To determine which specific services are managed each of the svchost.exe instances run tasklist /svc at the command prompt. The “Services” column will list the associated services and you can match the PID for that instance to the PID in Task Manager. (Sysinternals Process Explorer tool lists the service group and services for each svchost.exe instance in a tooltip.) To terminate a specific svchost.exe instance, run taskkill /pid PID, where PID is the PID returned by tasklist /svc, at the command prompt.

Return to top

Just For Fun


Ever wished you could express your IP address as a haiku? Well, maybe not, but that doesn’t mean that it can’t be done! Head over to this site and get your haiku. And the code is open source, so feel free to embellish a bit (essentially, it’s specialized hashing algorithm).


Star Trek movies (ships only)

Do you enjoy “director’s cut” versions of movies? Well, what if Star Trek movies were re-edited to include only the scenes involving the ships? No boring dialogue (“Khaaaaaaaaaaannn!” ) or transition scenes. Check these out. They at the same time soothing and strange, but definitely cool!


If Programming Languages Were Harry Potter Characters

We’ve seen this meme (of sorts!) before, but this one is way over the top. This author really knows programming languages and Harry Potter. Both funny and insightful.


Take Thomas Edison’s 146-Question Knowledge Test He Gave to Prospective Employees

Everyone knows that preparation for a job interview is vital. But do you think you’d have what it takes to get a job working for Thomas Edison a hundred years ago? You’ll probably be surprised about many of the questions!


Google Feud

So most of us have been using Google for at least a decade. And you probably think that you are pretty good anticipating what Google’s auto-suggest will show. So here’s your chance to prove it with a game that quizzes you on the top 10 suggestions for various words and phrases in categories such as culture, people (a.k.a. “celebrities”), names, and questions. It’s harder than it sounds.


Return to top