Approaching Iterativity
Initialization
I recently came across an article in which Scott Hanselman responded to a reader who wanted to know how to determine if they were actually a developer or just a good Googler.
Until I read this I hadn’t even thought about it. Not in those terms anyway. I think of myself as a successful developer, i.e. I’ve been gainfully employed as a developer for years. However, I don’t know if I’m actually a developer. I’ve certainly met and read the code of much better developers, people I consider actual developers, so the concept interests me. I’m certainly not a good Googler (mediocre at best) which means I should strive to determine if I’m actually a developer.
To that end, I’ve decided to take the advice Mr. Hanselman kindly offered his reader and work on one of the Code Katas while documenting the reference material I use. Since I’m currently polishing my proficiency[1] with JavaScript à la Node.js that’ll be the software context.
Condition
The kata I’ve chosen is transitive dependencies and, knowing that I want to do data entry via the command line, I hit up Google to see what I can get from Node.js. Stackoverflow, the result for most of my Googling, taught me[2] about the process object as well as some npm modules.
Since I’m just doing a kata, not developing a general, all-purpose solution, I opted to adopt the technique illustrated by this article in the nodejitsu documentation. As you’ll see in the code, I went with the complicated “simple example”.
I should mention that I tend (i.e. rarely fail) to reference the language documentation about everything. For JavaScript I use the MDN. I did go to stackoverflow for some of the object property stuff. Specifically, this question and this question.
Increment
Here’s my first attempt with the code kata. I don’t like the nested loops and I’m sure my JavaScript is sloppy so I’ll be coming back to make some improvements in a later article.
var app = {
deps: {},
concatDeps: function(key,a,b) {
var arr = [];
var i = 0;
for(; i < a.length; ++i) { arr.push(a[i]); }
for(i = 0; i < b.length; ++i) {
if(key !== b[i] && !arr.includes(b[i])) {
arr.push(b[i]);
}
}
return arr;
},
processLine: function (line) {
var depData = line.substring(0,line.length - 1);
return depData.split(' ');
},
graphDependencies: function () {
console.log('Original Chart:');
console.log(app.deps);
for(var aKey in app.deps) {
for(var bKey in app.deps ) {
if(aKey !== bKey && app.deps[aKey].includes(bKey)) {
app.deps[aKey] = app.concatDeps(
aKey,
app.deps[aKey],
app.deps[bKey]
);
}
}
}
console.log('Dependency Graph:');
console.log(app.deps);
process.exit();
},
readDataFromCli: function() {
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function(line) {
var data;
var i = 1;
if (line === 'q\n') {
app.graphDependencies();
} else {
data = app.processLine(line);
app.deps[data[0]] = [];
for(; i < data.length; ++i) {
app.deps[data[0]].push(data[i]);
}
}
});
}
};
app.readDataFromCli();
Statement
What I learned by both doing the code kata and tracking my resources is that my reference material didn’t tell me how to accomplish the task. I knew what I needed to look up by understanding the coding problem and my approach to its solution.
Maybe I misunderstood the initial question posed to Scott Hanselman. Was I supposed to use Google to find a solution? That option didn’t occur to me until just now. I’m going to have to work on my reading comprehension, seriously.
– Randy