March 2015 Newsletter
Simplicity is prerequisite for reliability. –Edsger W. Dijkstra
Pick battles big enough to matter, small enough to win. –Jonathan Kozol
The view that machines cannot give rise to surprises is due, I believe, to a fallacy to which philosophers and mathematicians are particularly subject. This is the assumption that as soon as a fact is presented to a mind all consequences of that fact spring into the mind simultaneously with it. It is a very useful assumption under many circumstances, but one too easily forgets that it is false. –Alan M. Turing, “Computing Machinery and Intelligence”
People don’t mind being challenged to do better if they know the request is coming from a caring heart. –Ken Blanchard
The acts of the mind, wherein it exerts its power over its simple ideas, are chiefly these three: Combining several simple ideas into one compound one; and thus all complex ideas are made. The second is bringing two ideas, whether simple or complex, together, so as to take a view of them at once, without uniting them into one; by which way it gets all its ideas of relations. The third is separating them from all other ideas that accompany them in their real existence: this is called abstraction: and thus all its general ideas are made. –John Locke
The higher we are placed, the more humbly we should walk. –Marcus Tullius Cicero
I will always seek God. Some people find God in church. Some people find God in nature. Some people find God in love; I find God in suffering. I've known for some time what my life's work is, using my hands as tools to relieve suffering. –Kayla Jean Mueller
I’m not sure what your experience with retrospectives on agile projects has been, but I have found them to be rather useless, mostly because the teams that I’ve been on fail to follow up on the actions and/or to measure to determine if the recommended changes make any difference. This article gives a comprehensive guide to carrying out the retrospective and then following through on the results.
One of the popular version control workflows is branch per feature. The main benefit touted is simplifying implementation of new functionality and then a single integration step among multiple features. So how well does it hold up in the real world? This article gives some assessment and advice.
This article points out one of the factors that gets lost on teams implementing agile development processes: It’s hard work! Many teams begin to lose steam after the initial excitement wears off, when they realize that, just like any methodology or process, agile requires appropriate “care and feeding” to succeed.
How do you know if you are headed in the right direction on your project or product? Perhaps this concept developed by Google Ventures, the venture capital arm of Google, would appeal to you. The design sprint is 5-day process broken up into five distinct one-day stages for laying out the problem to be solved through building and testing a real prototype.
As much as we like the image of the hero programmer who swoops in and snatches project victory from the jaws of defeat, it’s certainly not a sustainable operating paradigm. This author provides some good suggestions about how to maintain sanity, longevity, and continuity on your project. He says that it comes down to a few simple things: process, safeguards (think version control, etc.), documentation, testing (TDD and independent testing), and deployment (continuous integration).
As we note frequently, effort and duration estimation is one of the most difficult (and fraught with error!) aspects of the software development process. This author says that teams spend too much time on estimation in an effort to gain certainty and he points out that estimation is completely “wasteful” in the lean mindset. Instead, he suggests that more effort go into understanding the business value of a particular user story and ensuring that post-estimation communication between developer and stakeholder avoids situations where the story is stuck/blocked until a response is received.
As organizations expand in size, the complexity of getting and managing business requirements increases, as well. In this article, the author uses some nice analogies to explain a couple of strategies. However, he emphasizes that the key element of the process is in whether or not the developers can implement and test the defined requirements.
Metaphors are important tools in communication, especially when we, as technical professionals, interact with our business customer counterparts. However, since technical debt is such an important aspect of good application stewardship, we must be very precise when explaining the cost-benefit proposition of platform enhancements.
As this author points out, except for rare cases, such as safety-critical systems, “complete” testing is not a feasible approach. You must plan your testing to provide the best value for the available time and resources.
Long known for high-quality applications, former Apple CEO Jean-Louis Gassee raises questions about recent missteps by the company, such as the iCloud breach and problems with their desktop applications. Is the sun going down on Apple?
Most people know about the conventional wisdom of how Grace Hopper coined the term “bug”. This article gives you some nice background on the story and the etymology. (And I found this personally interesting since I spent part of my youth at NSWC in Dahlgren when my dad was stationed there.)
As part of a development, one of your responsibilities as a tester is to help the rest of the team navigate the bug tracking and resolution process. This article has some great tips to smooth the path for developers and to keep the channels of communication between testers and developers working well.
Technology is ubiquitous and there are very few areas of our lives that aren’t directly affected by technology. Automation is advancing in the transport world, as well. As this article discusses, the importance of software quality for self-driving cars is of paramount importance due to the potential liability due to software problems.
Even though Java 8 has been out for nearly a year, many developers are still transitioning to the new version. This article provides a thorough presentation of the new default method functionality, especially emphasizing some of the potential pitfalls.
While I’ve been extremely happy using Vagrant for virtualized development environments (check out my Laravel PHP 5.4 Vagrant configuration here, if you are interested), this article inspired me to look into Docker further. This tutorial will help you get Docker running by using the Docker Machine tool for simplifying the process of configuring a new container quickly.
When you switch web browsers to test your code on different platforms, it can get confusing about which incantation keyboard shortcut to use to open the developer tools on that browser. This simple site provides step-by-step instructions for all of the popular browsers and includes links to official documentation.
I don’t expect this tutorial to be immediately useable by most of our readers, but it’s always good to have some familiarity with various algorithms, so that when we run across a particular type of problem, you’ll recall that there’s something out there that might work. This tutorial is excellent in that explains not only the algorithm, including a simple example in Python, but situations where it is useful.
Markdown has become the de facto lingua franca (Wow! Two Latin phrases back-to-back! J) for online writing. For example, for GitHub ReadMe files, wikis, and elsewhere, the standard format is now Markdown. Markdown is a simple, yet rich language, but it takes a bit of practice to get the hang of it. This brief tutorial will get you going quickly.
Almost all of us can fall into the trap of self-destructive behaviors at various times. And, sometimes, these patterns can hurt our careers. These behavior patterns drawn from a new book on the topic can give a guide to identifying and correcting these problems when they come up.
Everyone wants to improve their technical and personal skills and for developers there are some specific things that are important. While there is no one-size-fits-all list, this one is an excellent cross-section of key practices that are applicable regardless of the technology or platform that you use.
Software architect is one of those things that is hard to put your finger on what exactly it means. This article does a good job (pun intended! J) of characterizing what it’s about and how it’s more of a role than an actual position.
One of the frustrations that many people have about development work is that the pace of change is so rapid and it’s almost impossible to keep up with the latest tools and technologies. This author shares his experiences with all of the “best practices” and new “gee whiz” frameworks that distract from actually getting the job at hand done.
To the casual observer, the Google Fiber product may look like a retail effort, but the reality is that it’s a key part of Google’s cloud strategy, which focuses on becoming a tier 1 facilities-based provider.
This handy little tool calls itself “a .gitignore magician in your command line” and that’s an apt description. Essentially, it’s a simple Python script that generates .gitignore files with appropriate defaults for a variety of programming languages and frameworks. It might be just the insurance policy you need to prevent uploading private information to Github!
Last month we featured a monospaced font for programming and this month were back with another good alternative. Code New Roman takes a variety of the patterns from other popular monospaced typefaces like Consolas and Vera Sans Mono and combines them into a font that has spacing similar to the traditional Courier type, which makes it very readable.
Bug Magnet is a helpful tool for manual web application testing that speeds up data entry, especially when testing boundary conditions. It installs a menu in Chrome with options for generating various text values, based on length; names, including those with special characters that are often problematic; e-mail addresses; numeric values; whitespace characters; and even format exploits like SQL injection.
Wow! Read about this passionate guy who is on a mission to remove every case of the grammatical error (or not!) ‘consists of’ from Wikipedia and the software tools that he built to do it. Certainly a bit offbeat, but still interesting. And, hopefully, it inspires you to practice good grammar in your code.
If you remember the space program from the 1950s and 1960s (or probably more if you don’t!), then you’ll love this brilliant ode to that era. Using audio clips from that time mixed with, what the aptly site calls, “futuristic Kraftwerk-meets-Aphex Twin-meets-Daft Punk sounds”, this album tells the story of the dawn of spaceflight, including JFK’s most inspiring speech, culminating with Apollo 11’s moon landing. Think of it as a retro-pop “Dark Side of the Moon” mashup with Sesame Street.
Hey, bro! How can you call yourself a designer when you don’t have a logo? Well, let the Hipster Logo Generator help you out. It includes plenty of cool schwag for customization. Feel better now? Keep calm and carry on!
One of the more prescient aspects of Orwell’s 1984 was the Newspeak language. The modern (post-modern?) business world has its own language too. If you are tired of reading these buzzwords online, then give Fluffify a try. It replaces these annoying words with an equivalent “normal” word. And since it’s open source, you can even contribute to the cross-reference dictionary. My favorite from the dictionary: "Richard Branson" = "Saruman the White".
Need to get your daily fix of “news” from Reddit, but afraid that the boss might be peering over your shoulder? CodeReddit disguises the Reddit front page as a PHP code listing. It’s a pretty cool implementation and even includes dynamic loading of comments.
Here’s the answer to a question that you probably never even thought of (I never had!): Why is the dollar sign ($) for US currency fashioned in the form of S? I don’t want to spoil the secret, but it’s actually a symbol borrowed from another currency!