|
title: Put the knife down and take a green herb, dude. |
descrip: One feller's views on the state of everyday computer science & its application (and now, OTHER STUFF) who isn't rich enough to shell out for www.myfreakinfirst-andlast-name.com Using 89% of the same design the blog had in 2001. |
|
FOR ENTERTAINMENT PURPOSES ONLY!!!
Back-up your data and, when you bike, always wear white. As an Amazon Associate, I earn from qualifying purchases. Affiliate links in green. |
|
|
x
MarkUpDown is the best Markdown editor for professionals on Windows 10. It includes two-pane live preview, in-app uploads to imgur for image hosting, and MultiMarkdown table support. Features you won't find anywhere else include...
You've wasted more than $15 of your time looking for a great Markdown editor. Stop looking. MarkUpDown is the app you're looking for. Learn more or head over to the 'Store now! |
|
| Thursday, March 01, 2018 | |
|
Oh google. Your raw source makes me something something. Why is this in the page itself? Why do you need so much source to display your page? What ever happened to humans writing html code? I know I sound like an assembly programmer in the land of OO, but it still makes me sad. ;^) Labels: cyborg, Google, human, javascript, sad, transpilation posted by ruffin at 3/01/2018 07:39:00 PM |
|
| Monday, February 19, 2018 | |
|
If your architect hasn't written a tutorial -- not a cursory howto, but a tutorial -- you don't have an architect. What does a tutorial look like? The canonical example for C# web apps, though now a bit long in the tooth, is NerdDinner:
There's not only a nicely written walkthrough, but documented code and a live, running example. If your architect hasn't taken the time to articulate their vision thoroughly, in plain, if expert-specific, [language of your locale], there's not much hope for your coders. Your codebase will necessarily be an unmaintainable cyborg (a topic I'm [not] surprised to find I've been ranting about since 2002). The best job security is none. You've set your stage so well any competent programmer could come in and take over, getting up to speed incredibly quickly. Those coders who work to ensure they're the most easily replaced are absolutely irreplaceable. Labels: architecture, coding, cyborg, style posted by ruffin at 2/19/2018 10:02:00 AM |
|
| Tuesday, May 24, 2016 | |
|
Saw a question on StackOverflow this morning that mentioned ESLint was merging with another JavaScript linter, JSCS, or at least their teams were. I added a quick comment:
Aside: I like aqui-volunteering. See what I did there? (Sorry.) One comment from the ESLint project's announcement about the merger bugged me, however...
Ah, the mythical volunteer month strikes again. If only all that were true. I still don't know what more coders really buys you. If you take the time to create clearly defined interfaces between every chunk of work, you can gain nearly 2x production from double the coders. And I think there's something to careful use of pair programming, which provides three sets of advantages:
The third is one of the most important. Forcing coders to share what they were doing and thinking with someone else gives you the first and second, but also means that your cyborg -- and all code is full of cyborgs, some strange melding of code and the style of the person(s) writing it -- is more spread out, reducing the impact whenever some of the meatware decides to move on. But does it work here?But when it comes to great JavaScript linting, I'm not sure more is better. You've still got one guy working on a linter as a side project that, afaict, is every bit as useful, if not moreso, in standardizing code and enforcing best practices than the work of the 371 (to date) at ESLint. (In case you're new to the blog, that's JSLint.) I mean, tell me which code you'd rather maintain:
or...
And I should point out the JSLint repo has no folders, and you really only need that single I like Nicholas at ESLint. Seems like a really good guy -- and ESLint seems like a good, well thought-out tool. It just seems like overkill -- harder to maintain, more to learn to use proficiently, more likely to change from installation to installation, which means less standardized code -- and there's nothing that bugs me like over-engineering. One example: Autofixing? Why not just use Typescript from the start? Seems too much for a linter. Teach me how to write good code. Don't automate the fishing. Here's a less biased example: Looks how excited this guy on SO is that ESLint makes it exceptionally easy to create new rules.. To me, that's cringeworthy -- No, no no, I don't want everyone on the team creating new rules! But if quickly creating custom rules is your use case, well, ESLint might be what you're looking to find. (Though, admittedly, I have suggested to others that they hack JSLint directly, since it's just JavaScript, which might be even worse.) Anyhow, just an interesting [to me] cultural contrast between two popular and useful linting projects. posted by ruffin at 5/24/2016 09:58:00 AM |
|
| Friday, June 26, 2015 | |
|
A good, thought-provoking post from Actively Lazy today:
That's true. Full stop. This, the communication price, is exactly why folks are still quoting The Mythical Man-Month. Communication makes [hu]man-months mythical. But what we do with this discovery is what's really important. It's easy to find one solution and think it's the only solution, as I believe Actively Lazy has done. Let's explore two. Pair ProgrammingHere's Mr. Green's (Actively Lazy's author's) take home (emphasis mine):
My quoting makes the argument a little worse; you really should read the entire post in context. But you get the picture. He's arguing that pair programming pays the "coordination and communication" costs as-you-go so that you don't have to pay the piper in spades, to mix some metaphors, later. Pair programming trades function for qualityWhen you work in pairs, you create less working code that is higher quality. This is nearly a truism. If you're somewhere code review's benefits aren't appreciated, run. I'm not saying you should require or even use a lot of code review -- my jury's still deliberating on its best use -- but reviewed code is of higher quality than code that isn't.
At the same time, that "high quality code" may not necessarily do the job better-qua-[characteristic X]. Just to get your started, here are a couple of common Characteristic Xs (feels like we're making Powerpuff Girls)[1]:
This is why iteration is such a catch-phrase for coding (though also see its abuse, here).[2] Get 'er done, then, if you have time to notice (or are forced to notice by poor performance), but only if you have time to notice, make it better. Quality vs. FunctionalitySo is pair programming the answer to removing communication problems? Sort of. Depends on why you think you need to communicate! One key here is that Green only has two developers:
If you only have two devs, of course pair programming kills the problem of deferred communication. But if you have 40 devs, you've now got 20 pairs that could need to sync back up. Twenty pairs is still much, much better than 40 individuals. Twenty pairs should also be much, much better than 20 individuals. The same way letting someone use your alpha version for 15 minutes uncovers bugs simply because they have a different mental model than yours, letting another strong developer take a look at your code will unearth some low hanging fruit (man, I'm mixing metaphors today. Uncover some barely buried tubers?) quickly. And even that single filter means your code will require less change to integrate with the rest of the team. The key take-home is that pair programming makes for higher quality software, not more of it. There's more than a single metric for evaluating software's worth. The other side of code is functionality, often reduced to the reasonably useful metric, lines of code (loc).
And there's a performance bar that tells us if code is good enough. That is, pair programmed code may be higher quality, but it may also not be significantly faster or use significantly less memory, etc. The biggest problem in evaluating how much quality you need is that often you don't know how significant a bad LINQ statement might be until you run it at scale. I think the suggestion is that you have to bias your development culture so that it always strives for high quality with respect to best practices. You want good scalability? Don't overuse ORMs. Don't push logic into the client. Write good SQL. Take time to plan your schema. But I don't know that pair programming, sacrificing half your speed for code quality, is necessary if you have this high-quality culture instilled with a team of well-hired developers. You get the point. The bottom line: Your code is higher quality if it's reviewed for standard practices, errors, and efficiency/scalability first, even if that review time reduces how much functionality you can build. But remember that functionality is why you're in business: you shouldn't sacrifice function for idealistic quality. In other words, you need to discover... The nasty truth: There is "good enough"Imperfect code can still provide acceptable functionality. News flash: There is no perfect code. [Most] Any solution is beyond a certain level of complexity is subjective. That there are many subjective Right Answers to complex problems, and it's precisely because you can only reasonably select one of them that you ask for advice before tackling them. That is, subjectivity is why you design code before coding. Even when you're going to tackle a major problem alone, you "pre-[re]view" with someone else (don't you?!!) your selection from all the different ways you [both] can think of to solve it. The reason you consult someone else first is because you know the problem you're working on needs an extra helping of quality mixed in with the quantity. You slow down, sacrificing not just your but your teammate's output, to ensure your output's quality. Your know your solution -- or at least its design -- needs a second set of eyes. In a sense, though you may not have touched a keyboard [much], you are already pair programming. The conflation of these two code metrics -- functionality & quality -- is what provokes Mr. Green to say...
Sure, one person working alone could bring the code back to a single narrative, but it'd be one person's narrative. You've right back into communication debt. Hopefully it's not as bad as it was before you'd code reviewed with your coworker, but the new communication debt again exists. This single person's progress is another unreviewed revision. And perhaps that's good enough. A different lesson: Seperation of concernsThe real key is that you can't have X people, where X is determined by your company's management, working on the same code at the same time without factoring in the communication costs for getting X folk on the same page. If you don't have time to factor in communication and code review, the new code will be worse in all of those standard ways -- best practices, efficiency, normalization/smart reuse, standardization, error handling. Worse, each person will find themselves coding around or being hamstrung by changes to their narrative made by X-1 other coders. Codebases shared by X devs without coordination is worse than having X coders doing their own thing. You do not get X-times (or "Xx" -- I regret my use of "X" at this point) the work, even if each dev is working on their own seemingly independent story! To get "Xx" functionality (and that's what the company wants, man. When you feel pressure to go faster, and are considering adding more devs to finish sooner, it's because you want functionality), you have to separate concerns perfectly.
The interface is a contract. And objective contracts (strangely possible in code; it's magic) are the most efficient means of communication for software projects. Now you're creating functionality as quickly as is possible. And if done correctly, you can get a lot closer to the myth. But there's a huge, obvious downside... Communication Debt added to your TechnicalAnd remember, if X is large and your stories are done by one person per story, your "communication debt" will be just as huge. You will have technical debt, and you will have a huge learning curve for the new dev if the person working on the code changes. And if the meatware half of the cyborg leaves your company before the knowledge transfer/code review takes place, you're in trouble. The good news? This debt will be firewalled by the interface. That's as far as the bad can go, if you have smart TDD. If X is large and your stories are done by two people, the debt will be more than halved, but your functional output could be more than halved as well! Quality code is hard, (c) 1842. [1] If you want an example of folks arguing against higher quality code for short-term preference Characteristic X, see the constant complaining about JSLint rules wherever JSLint is used. Let me summarize two-thirds of the answers on the JSLint tag on StackOverflow: "If you don't like rule X, you should use JSHint and turn it off." JSLint is a form of code review that emphasizes a set of "best practices". If you're left to your own devices, you might not always follow them. Following them might not make for better code in every situation, but you will have good, standardized code with fewer errors. JSLinted code is higher quality code, though conforming takes more time than not. As I've said before, "If I had to inherit legacy code sight unseen, and could only require that it be JSLinted or JSHinted (pick one), I'd pick JSLinted code every time," and that's because it's higher quality. [2] Hey, look! I've talked about Agile (here regarding documentation) as early as 2004! Three cheers for ourselves! Labels: coding, cyborg, long, management, style posted by ruffin at 6/26/2015 10:20:00 AM |
|
| Friday, July 31, 2009 | |
|
Amazon.com: Customer Discussions: Edward G. Nilges' discussion of Amazon reviews: Developers in my direct experience have too long been nailed to the cross of an inhouse 'programming language' written by some pompous lawn troll who didn't bother to learn theory. Exceptionally well said, as usual. Labels: cyborg posted by ruffin at 7/31/2009 07:35:00 PM |
|
| Thursday, April 19, 2007 | |
|
This quote from the GNU/Hurd description page caught me wondering if there isn't a serious paradox afoot. Although it is possible to bootstrap the GNU/Hurd system from the sources by cross-compiling and installing the system software and the basic applications, this is a difficult process. It is not recommended that you do this. Instead, you should get a binary distribution of the GNU/Hurd, which comes with all the GNU software precompiled and an installation routine which is easy to use. Wait, Hurd, the only 100% completely GNU-friendly OS out there is telling you that Hurd's open source is, practically speaking, worthless? I was pretty hard on Microsoft for doing the same thing, which compels me to be relatively tough again. If the build process is so convoluted as to be impractical, all Hurd has done is substituted a closed society of cyborgs for a dance on the legal intellectual property circuit. Perhaps we could argue that Microsoft made their "open standard" confusingly intricate intentionally, or at least that they weren't in a position where the .doc format had to be so complicated. Hurd, on the other hand, is an in-progress hack by a bunch of part-timers. Perhaps we should argue that Microsoft is making a profit and is traditionally more interested in closely their intellectual property than opening it for reuse in ways Hurd would never dream. Still, if GNU wants to show the value of open source and Freedom Software, they need to do a better job ensuring that their mascot, of sorts, is more accessible. If you ask me, with Hurd, the printer's still jammed and nobody can do a thing about it from where they're sitting. Instead of drafting GPL 3 or taking pot shots at Linux's file maintenance system, perhaps GNU should pour that time into making a clean, accessible Hurd. Labels: cyborg posted by ruffin at 4/19/2007 06:16:00 PM |
|
| Monday, December 12, 2005 | |
|
There are two kinds of programmers. If you believe that, let me also tell you what they are. There are those who program The Right Way, with fully modular, well-commented objects that can be picked up and edited, bug fixed, or expanded by anyone reasonably fluent in the skillset needed to create that sort of code. Then there are those that try their daggum-est to turn into cyborgs, where you have to have the human to understand what's going on with the code. "We can't fire John Doe! Without him the whole place would collapse!" Strangely, then, the best programmers are those who are confident enough in their abilities that they happily code themselves out of any job security -- and paradoxically, if their manager is worth a rip, thereby secure the same (that being job security, if the attempt at flair was too much, which I fear it was). This guy, the guy responding and refusing to list the bugs he feels must be fixed before the product is released, is pretty clearly of the second kind. >As Kim has mentioned, it is unclear what bugs you are referring to. >There are only a couple of bugs listed in FOR-RELEASE. The bugs in >emacs-pretest-bug, which are usually minor problems, get fixed at >about the same rate as they are being reported, i.e. after a few days. >Maybe the reason you have the idea that bugs aren't being fixed >because developers sometimes don't send a follow-up email to the list >when they check their fix into CVS. I hope soon to have time to recheck the saved mail. But there are several messages I have posted more than once on this list, with no response, which will go into FOR-RELEASE when I get future reminders. Labels: cyborg posted by ruffin at 12/12/2005 03:23:00 PM |
|
| Monday, March 29, 2004 | |
|
As I've ranted before, I believe, creating a cyborg does not give you ironclad job security, regardless of past perception. People feel better when there are parts of a computer system only they understand, but eventually you'll liable to get a manager worth their salt in there and suddenly those parts that used to require you will be replaced by adequate documentation. And that's where the fallacy lies for so many people. Look, even with adequate docs you'll still know more about what you do than anyone else. Just remember that your goal should be to do your job well, including getting the position ready for your replacement -- whether you end up moving laterally, up, or away -- not making sure that you still have a job no matter what happens. If you're not able to do your job well, well, start looking for another job. You, and everyone down the line, will be happier for it. Labels: cyborg posted by ruffin at 3/29/2004 11:43:00 AM |
|
| Friday, March 19, 2004 | |
|
In the latest "Software Development magazine's Agile Modeling newsletter" (don't have the first clue when/why/if I signed up for this email, but it's been interesting so far and I haven't starting trashing yet), Scott Ambert talks about when to and when not to document, using "Agile Modelling" as his context. Here's what "Agile Modelling" is in brief, taken from his site: Agile Modeling (AM) is a practice-based methodology for effective modeling and documentation of software-based systems. Simply put, Agile Modeling (AM) is a collection of values, principles, and practices for modeling software that can be applied on a software development project in an effective and light-weight manner. I'd like to look at three of his points, the first a "when to document" and the next two are "when not to document" (bold is mine): [A "when to document"]: --To support communication with an external group. It isn't always possible to colocate a development team, and it isn't always possible to have project stakeholders available at all times. When you need to work with an external group of people, you need to find ways to communicate with them. Shared documentation is often part of the solution -- along with occasional face-to-face discussions, teleconferencing, e-mail and collaborative tools -- but it should play only a supporting role. Documentation should be a last resort for communicating with an external group, because it's far too easy to misunderstand something that's been written. [Two examples of "when to not document"]: -- Your process says to create the document. Although this isn't a problem with agile software processes, it can be with prescriptive processes. -- You're specifying work for an internal group. Documentation is one way to communicate, but it isn't the best. Instead, consider working sessions with the other group or the use of collaborative tools. Let me clue in the ill-informed: You're always programming for the guy/gal who's going to replace you. Likely you don't who know this person is going to be. You can't assume they're already in your working group. You have to write code that "passes the bus test" ("in case you get hit by a bus tomorrow") -- or, as I like to phrase it, pass the less violent "techno-hermit test" ("in case you go all ludophobic and run for the hills without your laptop tomorrow"). Chances are after any programmer turns in their notice, those two weeks or so won't leave enough time to find a replacement and adequately effect a knowledge transfer. Nor is it very useful to shove the knowledge into an intermediary. It's best to have the code have docs with it as it's being created so that a new schmoe can get that knowledge without the original hacker there -- and it also has a near-magical effect of creating better code as well. (Aside: I'm not asking for mad docs. You should have exactly as much documentation as necessary for a programmer with equal skills to pick up and understand what's going on in a general sense without looking at the code. This could very well mean just a collection of well written flowerboxes to objects and methods, but could be something a bit nicer, with pix of the interface, etc.) Although the belief that programmers can be thought of as inhuman, interchangable resources, which is obviously not the case, is too widely held, the best programmers and programming groups do their best to deliver high-quality code and documentation that makes the impossibliity of having interchangable programmers as nearly the case as possible. So let's sum up. You're always programming for an external group, meaning that documentation can safely -- and should! -- be part of your process. Nothing, and I mean nothing, hurts a project like a developer leaving and the new fellow or gal coming to work on a cyborg with the human-half missing. Except for hiring boneheaded coders in the first (or second) place. Labels: cyborg posted by ruffin at 3/19/2004 05:02:00 PM |
|
| Wednesday, November 05, 2003 | |
|
If a company can't show you a running version of any app not only that they've developed (and still support) but also that they're developing, don't work there. Heard of daily builds? You need them. You need that overhead in place already to ensure that you've got a mature, robust development process in place. And if you find yourself someplace that doesn't happen now, start it. It's a lot of overhead, sure, but it's really a requirement for a workplace that's not going to stick you with horrible to handle "legacy" work (eg, "Coder X left the company and the project's yours now." Without the symptoms of a mature coding process evident, you could end up with the dreaded worst case here -- code that Coder X could upgrade in an hour but that'll take you three weeks just to begin to understand. Why does this happen? Coders without processes tend to create cyborgs, not maintainable code. This is due to a number of reasons: laziness, perceived job security (I'm the only one that can do this), lack of skill, etc.) At any rate, you've been warned. Labels: cyborg posted by ruffin at 11/05/2003 05:31:00 PM |
|
| Thursday, September 26, 2002 | |
|
I've had a great time closing out my work day the past two evenings reading The Mythical Man-Month by Frederick Brooks. I'm barely into the book at all (usually just take 5-10 minutes to relax after programming burn-out), but so far the lessons related are awfully good ones. I'd originally shied away from reading this book because it was someone talking about writing the IBM System/360's software. But things obviously haven't changed much in 25-30 years. The talk is, so far, at a high enough level that visions of my current projects jump into my mind when, almost certainly, the author is thinking about his work in the 1970's. Anyhow, one thing that Brooks points out right from the start is the difference between a "Program" and a "Programming Product". In brief, he says that the garage programmer is making "programs" and software shops are putting out "programming products". The latter is, by definition, something that is easily extented by anyone and is written in a "generalized fashion". It is also well tested with a variety of test cases. He guesses that this takes about three times as long to create as a simple program. I think that's a little short, but anyhow... It's interesting to look back over the projects with which I've been involved over the last several years and notice which are programs and which are true programming products. (Brooks has another two types of end results for programming, but I'm going to stick to two for the time being.) Most of what goes on where I work is the creation of simple programs. People get a task, in the past a "one-programmer-per-programming-task" sorta deal, and they went off and made it. When that programmer left, you were left with a sort of "cyborg without the cy". Nobody could quickly and easily take over the program because it hadn't been written in a general fashion for anyone to extend. There were few "objects" that could be picked up and extended; instead you had to get intimately invovled with the legacy code to add significant functionality (or to figure out the cause of a bug). He's also gone on to show how adding more workers to a project simply doesn't work in a programming task, because of something quite similar. If you add someone to the mix before you're done with a programming product, you have to explain what it is that you're writing to this new person. That, with a myriad of other factors, makes new help on a project extend, rather than reduce, the time needed to finish a project. Voila, "mythical man-month". So spam out, it's a good book. Hang on, ah yes. If you've tried #develop and compared it to Microsoft's Visual Studio.NET, you'll see a pretty good example of a program versus a programming systems product (what comes after a programming product for Brooks). #develop has some great features (and I honestly haven't looked at its code; it could be very good), but usability isn't anywhere as close to being as good as VS.NET. I like the concept of an open source IDE for C# (and when I start C# programming in earnest, I'm going to give #develop another good shot), but let's face it, some scary dude holding up a shirt just can't compete with Microsoft's VS.NET team when it comes to testing all the in's and out's of an IDE. Some things in #develop might make perfect sense to the people most closely associated to the project, but it's not as well-done overall as the behemoth VS.NET coming outta Washington state. Labels: cyborg posted by ruffin at 9/26/2002 01:02:00 PM |
|
|
| |
|
|
All posts can be accessed here: Just the last year o' posts: |
|||||||||||||||||||||
|
||||||||||||||||||||||
|
|
|
|