David Veksler: Some lesser-known truths about programming - things newcomers into the field of IT don't know and don't expect, true and an interesting read. Not backed by good data but anyway. F.ex.: "[..] a programmer spends about 10-20% of his time writing code [..] much of the other 90% thinking, researching, and experimenting". "A good programmer is ten times more productive than an average programmer. A great programmer is 20-100 times more productive than the average [..]" "Bad programmers write code which lacks conceptual integrity, non-redundancy, hierarchy, and patterns, and so is very difficult to refactor." "Continuous change leads to software rot, which erodes the conceptual integrity of the original design." "A 2004 study found that most software projects (51%) will fail in a critical aspect, and 15% will fail totally."
Brett L. Schuchert: Modern Mocking Tools and Black Magic - An example of power corrupting - interesting for two reasons: a good analysis of a poorly written piece of code and discussion of the code injection black magic (JMockIt) vs. actually breaking dependencies to enable tests. The author presents a typical example of low-quality method (mixing multiple concerns, mixing different levels of abstractions, untestable due to a hardcoded use of an external call) and discusses ways to improve it and to make it testable. Recommended to read.
It’s Not About the Unit Tests - Learning from iOS Developers: iOS developers don't do much testing yet they manage to produce high quality. How is that possible? The key isn't testing itself, but caring for the code. (Of course, iOS is little special: small apps, no legacy, a powerful platform that does lot for the apps, very visual apps.) "It’s not about the practices. It’s about the spirit and intent behind them, and how they are applied." (M. Fowler had a similar observation about a team that used mock-based testing exclusively and thus lacked integration tests yet all worked. [I've lost the link to the post and would be grateful for it])
Java Code Quality Tools – Overview - brief descriptions of 44 quality-related tools including some interesting tools and Eclipse plugins I didn't know or knew but forgot. F.ex. analysis of dependencies with JBoss Tattletale or JarAnalyzer, Clirr to check libraries for source and binary backwards compatibility, JDiff generates JavaDoc-based report of removed/added/changed in an API. Spoon - read and check or transform Java code. Java PathFinder (NASA) - special JVM capable of checking all execution path to discover concurrency defects etc.
Tools
DirB, Directory Bookmarks for Bash (home) - moving efficiently among favourite directories (s <name> to create a bookmark for pwd, g <bookmark | relative/abs dir path> to enter a dir (=> works both for bookmarks and as a replacement for cd); also support for relative path bookmarks & more; sl lists bookmakrs in the last used order) (You might also want to check out Autojump, described in Dec 11; bashmarks is another similar project. Another similar project is rupa's z and j2 and the fish clone z-fish)
Clojure Corner
Jon Pither: Clojure at a Bank – Moving from Java - the justification (productivity, dynamism, FP a better match for the domain) and process behind moving from Java to Clojure with a monolithic 1M LOC Spring/Hibernate app. (Random quotes: "I had used some dynamical languages before and it was quite obvious that we were essentially forcing lots of schema and type definition on to a problem domain that just didn’t want or need it." "[..] it [dependency injection] just looks redundant in retrospect now that I’m working 95% with FP code.") There is also a EuroClojure talk about their experiences one year later (35 min).
Prismatic's "Graph" at Strange Loop - an interesting desing problem, its solution, and a resulting OSS library. The problem: How to break a large function into independently usable small ones that might depend on each other without ever needing to recompute a value once the function producing is called. The solution: Graph - "Graph is a simple, declarative abstraction to express compositional structure." (Enabling explicit declaration of data dependencies and pluging in different implementations.)
The Oblong: Blog about 2/3 D game programming in Clojure, starting from scratch (w/o an engine); interesting experiences
Clojure vs. Scala smackdown ("Just kidding with the title of this post :-)") - a short post with interesting discussion. Dmitri Sotnikov's opinion resonates with me: "I found that for me Clojure wins on simplicity and consistency. While it looks more alien initially, once you learn the basics, you just reuse the same patterns everywhere." Some more comments: "One major concern was maintainability, since it's fairly easy to write very dense code. This turned out to not be a problem in practice. Because Clojure code is written as a tree, refactoring it is very easy." REPL seems to be a big win (applies to Scala too). Scala's type system might get tedious and learning its quirks takes time but there is lot of potential and both have they strong sides.
Code Fatigue - discussion of the advantages of learning, using, and combining the (many) standard Clojure functions instead of a "basic solution" using recursion etc. The argument is in favor of higher-level code with less complexity in the form of branching, recursion, nested expressions etc. and thus less mental fatigue.
Favorite Quotes
A classic test only cares about the final state - not how that state was derived. Mockist tests are thus more coupled to the implementation [emphasis mine] of a method. Changing the nature of calls to collaborators usually cause a mockist test to break.
I'm afraid of code. When I see a big pile of code, I get scared ;-). Some classes and method make me cry. I had troubles explaining why I prefer short pieces of code keeping the same level of abstraction, cohesive and loosely coupled. The following quote captures the essence - improved communication.
One way to improve communication is to reduce the need for it and the same can be said for code. [...] Since we tend to read code more than write it, anything we can do to reduce the need to read code is time well invested in the life of a project.