Jay Fields
blog.jayfields.com · Personal blog · on HN since 2007
Jay Fields, a software developer and consultant, writes about Clojure, Ruby testing, pair programming, technical books and developer productivity.
What HN saysCommenters point to it for Ruby testing posts, Clojure destructuring and thoughts on pair programming and consulting, treating it as a useful practitioner's blog.
52HN people shared it
10linked it in comments
78stories submitted
893story points
4 years agolast shared
2007people per year2026
Most-shared posts
- 1Clojure's Destructuring3 people · 47 points · first shared 2010 · discussion on HN
- 2The Cost of Net Negative Producing Programmers3 people · 21 points · first shared 2009 · 7 comments on HN
- 3Is Productivity Killing Your Creativity?3 people · 8 points · first shared 2012 · discussion on HN
- 4REPL Driven Development3 people · 7 points · first shared 2014 · discussion on HN
- 5The Case for Buying Technical Books2 people · 78 points · first shared 2014 · 52 comments on HN
- 6Clojure: State Management2 people · 11 points · first shared 2011 · discussion on HN
- 7Thoughts on Developer Testing2 people · 9 points · first shared 2009 · 5 comments on HN
- 8Life After Pair Programming2 people · 6 points · first shared 2011 · discussion on HN
- 9The Single Best Thing For My Career2 people · 6 points · first shared 2012 · discussion on HN
- 10Ruby: Testing Private Methods by 'publicizing' them2 people · 4 points · first shared 2007 · discussion on HN
- 11Clojure: Composing Functions2 people · 3 points · first shared 2010 · discussion on HN
- 12Ruby: Inject (2008)2 people · 2 points · first shared 2011 · discussion on HN
- 13Linux Commands for Developers1 people · 98 points · first shared 2012 · 64 comments on HN
- 14How I Open Source1 people · 77 points · first shared 2012 · 10 comments on HN
- 15Clojure & Java Interop1 people · 64 points · first shared 2011 · 14 comments on HN
What HN people wrote when they linked it
twic · 2019-02-18
> What we call technical debt is really best analogous to an uncovered short sale
Steve Freeman famously described it as an unhedged call option:
https://jaxenter.com/bad-code-isnt-technical-debt-103059.html
The key difference between a short position and a call option is that the former is linear, whereas the latter is not: if things let a little bit worse, a short will lose a little bit of money, whereas a call will cost nothing, but if things get a lot worse, a short will lose a lot of money, and a call may lose an enormous amount of money.
Someone who actually works at some dodgy trading company argued that some kinds of debt are like options, and some are like debt - and so potentially, some are like shorts:
http://blog.jayfields.com/2011/03/types-of-technical-debt.html
So now we just need to calculate our technical debt portfolio's delta, beta, vega, theta, rho ...
jaycfields · 2014-08-25
No hate for consultants from me. The opposite, actually: http://blog.jayfields.com/2012/05/single-best-thing-for-my-career.html
Consultants should write books, but I believe we'd all benefit if non-consultants wrote books as well.
wastedbrains · 2008-10-21
Jay Fields also has an excellent collection of blog posts on Ruby particularly useful stuff when you are looking into doing better Ruby testing.
Some I have found interesting
http://blog.jayfields.com/2007/09/rails-how-we-test.html
http://blog.jayfields.com/2007/11/ruby-testing-private-methods.html
http://blog.jayfields.com/2007/05/ruby-unit-testing-delegations.html
http://blog.jayfields.com/2008/01/testing-one-expectation-per-test.htm…
lkrubner · 2014-08-03
This is great, and it is also worth reading "Destructuring in Clojure and Ruby":
http://eyeofthesquid.com/blog/2013/09/29/destructing-in-ruby-and-cloju…
which has some great comparisons. As it says:
"As with many things in Ruby, the better question than “Can it be done this way?” is “Is it wise?”. "
There is a lot that you can do in Ruby that is more gracefully done in Clojure. Brian Carper brings this out even more clearly with his post "Keyword Arguments: Ruby, Clojure, Common Lisp":
http://briancarper.net/blog/579/keyword-arguments-ruby-clojure-common-…
That post shows the exact point where keyword arguments in Ruby can become ambiguous, which is the exact moment that Clojure's clarity becomes obvious.
Also, Jay Field's post on the subject of Clojure destructuring is where I got a lot of practical starting ideas (such as using the :keys directive):
http://blog.jayfields.com/2010/07/clojure-destructuring.html
johnkchow · 2012-01-10
I have to agree that PP loses value when you have many senior level programmers on the team. The biggest value in PP, in my personal experience, is transfer of knowledge and experience. This applies mostly to teams with huge gaps in experience (juniors vs. seniors) or new team members that need to be caught up to speed with the codebase.
If the talent level is the same (and by talent I mean having the innate passion and ability to learn, not having actual knowledge) the knowledge of the collective team members will eventually equalize through the initial PP sessions.
Like the author said, the context of the team and the general strategy of the company (i.e. maintaining a project vs developing new features) are the most important signals when determining the programming tactics (i.e. PP and self-learning) to reach those goals.
P.S. The link at the bottom of the article (http://blog.jayfields.com/2011/08/life-after-pair-programming.html), provides two great team contexts for when pair programming succeeds and when it fails. Definitely take a read on that.
valbaca · 2022-06-27
Whether to pass in a single dict/object/map/assoc-list or individually separated arguments is a tale as old as LISP (JS has some FP roots if you squint hard enough) and most LISPs (and JS has started doing this as well) mitigates this with destructuring:
Common Lisp: https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node252.html
Clojure: http://blog.jayfields.com/2010/07/clojure-destructuring.html
JS: https://simonsmith.io/destructuring-objects-as-function-parameters-in-…
DanielRibeiro · 2012-01-16
This perception even has a name: Net Negative Producing Programmers[1][2]
[1] http://blog.jayfields.com/2009/01/cost-of-net-negative-producing.html
[2] http://en.wikipedia.org/wiki/NNPP
JonnieCache · 2011-04-23
Something that I only realised the other day which made me feel kinda embarrassed: in ruby, the reduce method is called inject.
For years I've been doing MapReduce functions, without realising it. MapReduce was in my mental pile of "genius things that cleverer people than me do, must be looked into when there is time."
For info on inject: http://blog.jayfields.com/2008/03/ruby-inject.html
sh1mmer · 2009-01-06
Vaguely interesting article to me. It's basically a reality check for this: http://blog.jayfields.com/2009/01/cost-of-net-negative-producing.html
In short the reasons why you a good programmer can't remove all the "bad programmers"
1. Working out who is good and bad is hard
2. It would involve too much politics that you may not be good at
3. You look like a jerk if you besmirch your co-workers
4. It's easiest for companies to hire based on "years of experience"
yogthos · 2018-10-07
That is pure and utter FUD I'm afraid. My team has been working with Clojure for over 8 years now. We have tons of code in production, and we don't have any problems maintaining these projects. Furthermore, there's absolutely no empirical evidence to support the notion that static typing results in statistically significant reduction in defects, speed of development, or ease of maintenance. Considering how long both disciplines have been around, and the sheer amount of software written in each, that's quite the elephant in the room. I also have no idea who the people migrating from Clojure to OCaml, Haskell, or F# are. I don't think I've seen a single story about a company doing that.
My experience is that dynamic typing is problematic in imperative/OO languages. One problem is that the data is mutable, and you pass things around by reference. Even if you knew the shape of the data originally, there's no way to tell whether it's been changed elsewhere via side effects. The other problem is that OO encourages proliferation of types in your code. Keeping track of that quickly gets out of hand.
What I find to be of highest importance is the ability to reason about parts of the application in isolation, and types don't provide much help in that regard. When you have shared mutable state, it becomes impossible to track it in your head as application size grows. Knowing the types of the data does not reduce the complexity of understanding how different parts of the application…